4

iOS アプリ用に iBeacon 範囲を実装しようとしています。

[locationManager requestAlwaysAuthorization];
CLBeaconRegion * region = [self regionFromUUID:uuid];
[locationManager startMonitoringForRegion:region];

デバイスがリージョンの内側にあるか外側にあるかを判断するには、次のようにします。

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

これは正常に呼び出します:

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
    if (state == CLRegionStateInside) {
        [locationManager startRangingBeaconsInRegion:(CLBeaconRegion*)region];
    } else {
        [locationManager stopRangingBeaconsInRegion:(CLBeaconRegion*)region];
    }
}

アプリは正常に進行中locationManager:didRangeBeacons:inRegion:です。

私が遭遇している問題は、を使用してrequestWhenInUseAuthorizationいます。locationManager:didStartMonitoringForRegion:呼び出しの後[location requestStateForRegion:region]、デリゲート メソッドlocationManager:monitoringDidFailForRegion:withError:はエラー コード 4: "操作を完了できませんでした" を返します。

とのスワップは、このエラーを回避requestStateForRegionしているようで、正常に呼び出されます。startRangingBeaconsInRegionlocationManager:didRangeBeacons:inRegion:

[locationManager requestStateForRegion:region];これは、許可されている場合にのみエラー コード 4 が発生する既知の問題kCLAuthorizationStatusAuthorizedWhenInUseですか?

4

2 に答える 2

4

Region Monitoringに関する Apple のドキュメントは、次の抜粋で私を悩ませていました。

承認ステータスが kCLAuthorizationStatusAuthorized の場合、アプリは登録したすべてのリージョンの境界通過通知を受け取ることができます。認証ステータスが他の値に設定されている場合、アプリはそれらの通知を受け取りません。

私は、kCLAuthorizationStatusAuthorized(iOS 8 で非推奨) と が含まれるkCLAuthorizationStatusAuthorizedAlwaysと考えkCLAuthorizationStatusAuthorizedWhenInUseていました。どちらも特別なタイプの「承認済み」だったからです。

@heypiotr のおかげで、実際にApple Docs Declarationを確認することにし、enum が次のように宣言していることに気付きました。

kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedWhenInUse 

Apple によると、監視でのみ機能するため、それが と同じ唯一の値であるため、requestStateForRegionrequires が必要です。kCLAuthorizationStatusAuthorizedAlwayskCLAuthorizationStatusAuthorizedkCLAuthorizationStatusAuthorized

于 2016-03-21T21:39:23.420 に答える
1

アプリがアクティブなときにのみ監視を実行しようとしている場合でも、コア位置監視には「常に」承認が必要です。は監視 API の一部であるためrequestStateForRegion、「使用中」の承認時に監視エラーがスローされる理由を説明します。

私が考えることができる唯一の回避策は、「使用中」の承認時に、すぐに測距を開始requestStateForRegionし、特定のビーコンの範囲内にあるか範囲外にいるかを判断する代わりに、測距結果を使用することです。

于 2016-03-21T16:10:38.887 に答える