web-dev-qa-db-ja.com

locationManager:didEnterRegionは、ビーコンが検出されたときに呼び出されません

ビーコン(iOSデバイス)でテストしているときに、リスナービーコンが予期しない動作をすることがわかりました。 locationManager:didEnterRegionビーコンがリージョンに入っても、メソッドは呼び出されません。しかし、locationManager:didRangeBeacons:inRegion:は正しく呼び出されており、検出されたビーコンがそこに表示されます。誰かがこのようなことを経験したことがありますか。

17
Dhanesh KM

メソッドが次のように実装されているかどうかを確認してください。 viewDidLoadで、最後に監視を開始します

self.beaconRegion.notifyOnEntry=YES;
self.beaconRegion.notifyOnExit=YES;
self.beaconRegion.notifyEntryStateOnDisplay=YES;
[self.locationManager startMonitoringForRegion:self.beaconRegion];

監視開始後、定義したリージョンの状態をリクエストします

- (void) locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    [self.locationManager requestStateForRegion:self.beaconRegion];
}

状態が決定したら、ビーコンの測距を開始します

-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    if (state == CLRegionStateInside)
    {
        //Start Ranging
        [manager startRangingBeaconsInRegion:self.beaconRegion];
    }
    else
    {
        //Stop Ranging here
    }
}

必要に応じて次のメソッドを実装します...

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    self.statusLbl.text=@"Entered region";
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    self.statusLbl.text=@"Exited region";
}

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
    if(beacons.count>0)
    {}
}

これがあなたの問題を解決することを願っています。

32
before starting coding in project , you must follow given setup guidlines -->
1. in project info or info.plist -->
         Custom IOS Target Properties -->
                    . add "Required background modes"
                    . in this add two items -->
                                ."App shares data using CoreBluetooth"
                                ."App registers for location updates"
2. in project Capability -->
         There is Background Modes  
                   . check "Loaction update"  
                   . check "Acts as a Bluetooth LE accessory"
                   . check "uses bluetooth LE accessories"

(そして、Davidgyoung氏の指示に従ってください。私を信じてください。間違いなく機能します。)

12
Nitesh

また、特定のビーコンではなく、region-を監視していることに注意する必要があります。

したがって、同じproximityUUIDを共有する3つのビーコンがあり、リージョンがproximityUUIDのみ(メジャー値とマイナー値なし)として定義されている場合、次の2つの状況でのみ通知が届きます。

  1. 地域からのビーコンは範囲内になく、最初のビーコン/ビーコンが検出されます(didEnterRegion:

  2. 地域からの1つ以上のビーコンが範囲内にあり、それらはすべて約30秒間見えなくなりました(didExitRegion:

7
Maciek Czarnik

あなたのテストの開始条件についての詳細がなければ、私がまったく同じことを見たかどうかを言うのは難しいです。しかし、はい、いくつかの特定のケースでは、locationManager:didEnterRegionへの呼び出しを取得しなくてもlocationManager:didRangeBeacons:inRegionが呼び出されるのを見ました。

同じリージョンで同時にレンジングとモニタリングを開始し、iOSが監視対象リージョンにすでにであると判断した場合、locationManager:didEnterRegionへの呼び出しを受け取れない可能性があります。

何かが間違っているかどうかを本当にテストするには、次のようなテストケースを設定する必要があります。

  1. その地域にいないことを確認してください。
  2. IOSを数分間実行します
  3. その地域の監視を開始します
  4. IOSを数分間実行し続けます
  5. 地域を入力してください。
  6. LocationManager:didEnterRegionへの呼び出しを取得するかどうかを確認します

上記を実行しても電話がかかってこない場合は、間違いなく問題があります。

7
davidgyoung