

ビーコンの検知までに時間がかかる事象が発生しています。

再現手順は、  
①[self findBeacon]; を実行して検知を開始する  
②ビーコンをＯＮにする  
③「EnterRegion.」「CLRegionStateInside.」が表示される  
④「FindBeacon.」が表示されビーコンを検知  
⑤ビーコンをＯＦＦ  
⑥しばらくすると「ExitRegion」「CLRegionStateOutside」が表示される  
⑦ビーコンをＯＮにする

この後に「EnterRegion.」「CLRegionStateInside.」が表示されるまでに時間がかかる場合があります。  
iPhone5(iOS8.4.1)で試しているんですが、30秒程度かかる場合もあれば２、３秒で表示される場合もあります。  
別の端末だと、２分以上かかる場合もありました。

「EnterRegion.」にならないとビーコンが検知されないようなので困っています。

実装のやり方として間違っているところがありますでしょうか？  
よろしくお願い致します。

[code]

    - (void)findBeacon {
      CLLocationManager *locationManager = [CLLocationManager new];
      [locationManager startMonitoringForRegion:beaconRegion];
    }
    
    - (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
      NSLog(@"startMonitoring");
      [manager requestStateForRegion:region];
    }
    
    - (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
      switch (state) {
        case CLRegionStateInside:
          NSLog(@"CLRegionStateInside");
          CLBeaconRegion *beaconRegion = (CLBeaconRegion*)region;
          [manager startRangingBeaconsInRegion:beaconRegion];
          break;
        case CLRegionStateOutside:
          NSLog(@"CLRegionStateOutside");
          break;
    }
    
    -(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
      NSLog(@"EnterRegion.");
      [manager startRangingBeaconsInRegion:(CLBeaconRegion*)region];
    }
    
    -(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
      NSLog(@"ExitRegion.");
      [manager stopRangingBeaconsInRegion:(CLBeaconRegion *)region];
    }
    
    -(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
      NSLog(@"FindBeacon.");
    }
    
[/code]


CC BY-SA 3.0
2015-09-26T08:03:17.407
16949
2016-04-03T19:55:15.577
7212
question
objective-c ibeacon
iBeaconでExitRegionからEnterRegionになるまでに時間がかかる場合があります


参考になるかわかりませんが、気になったところを幾つか書かせて頂きます。

  * `startRangingBeaconsInRegion`の実行が多い  
iBeacon領域外から領域内に入った場合、`didDetermineState`と`didEnterRegion`が呼ばれます。また、既にiBeacon領域にいる状態でアプリを起動すると、`didDetermineState`のみ呼ばれます。(
**didEnterRegion** は呼ばれません)  
なので、私の場合は`startRangingBeaconsInRegion`を`didDetermineState`の`CLRegionStateInside`を通った時のみにしています。

  * `requestStateForRegion`の実行について  
一連の流れとしては、アプリをフォアグラウンド起動させっぱなしの話かと思います。  
私の場合は既にiBeacon領域内にいる状態でアプリを起動したところ、  
`didDetermineState`が呼ばれなかったため、  
`requestStateForRegion`を実行してiBeaconを検知するようにしていました。

因みに、端末の電源がOFFの状態からONにした直後はiBeaconを検知してくれませんでした。  
後は特に問題なさそうに見えます。

何かの参考になれば幸いです。


CC BY-SA 3.0
2015-10-06T11:31:57.287
17320
2015-10-06T11:31:57.287
8968
16949
answer