web-dev-qa-db-ja.com

iOS9はバックグラウンドで位置を追跡しません

バックグラウンドでアプリが位置情報を追跡しています...位置情報バックグラウンドモードが有効になっていて、

[self.locationManager startUpdatingLocation];

これはiOS7-8しかしiOS9

シミュレーターでは機能しますが、実際のデバイスではバックグラウンドでコールバックが発生しません... iOS8デバイスで同じコードを実行すると、以前と同様に通常のコールバックが発生します

これは文書化されていますか?なぜデバイスではなくシミュレータで動作するのですか?それはバグですか?

startSignificantChangeUpdatesを使用する場合、iOS9で動作しますが、これは何らかのバッテリー節約機能であるか、startUpdatingLocationを禁止している可能性があります

22
Peter Lapisu

使用する:

if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [self.locationManager setAllowsBackgroundLocationUpdates:YES];
}

システムバージョンを評価するマクロの使用を避けるため。これにより、iOS 9ではsetAllowsBackgroundLocationUpdates:が呼び出されますが、iOS 8では呼び出されません。

34
sigsegfalt

IOS 9の場所については、以下のリファレンスを使用してください

iOS9のCLLocationManagerでBackgroundLocationUpdatesを許可

この新しいプロパティは、WWDCセッション「コアロケーションの新機能」で説明されています。

IOS 9に対してリンクする場合、デフォルト値はNOです。

アプリがバックグラウンドで位置を使用する場合(青色のステータスバーを表示しない)、Info.plistでバックグラウンドモード機能を設定することに加えて、allowsBackgroundLocationUpdatesをYESに設定する必要があります。それ以外の場合、位置の更新はフォアグラウンドでのみ配信されます。利点は、同じアプリ内で、バックグラウンドのロケーション更新があるロケーションマネージャーと、フォアグラウンドのロケーション更新のみがある他のロケーションマネージャーを持つことができることです。値をNOにリセットして、動作を変更することもできます。

ドキュメントはそれについてかなり明確です:

デフォルトでは、iOS 9.0以降に対してリンクされているアプリケーションの場合、最小展開ターゲットに関係なく、NOです。

Info.plistに「location」を含めるようにUIBackgroundModesを設定すると、バックグラウンドで続行する意図で-startUpdatingLocationを呼び出すたびに、実行時にこのプロパティをYESに設定する必要があります。

UIBackgroundModesに「location」が含まれていない場合、このプロパティをYESに設定すると致命的なエラーになります。

このプロパティをNOにリセットすることは、UIBackgroundModes値から「location」を省略することと同等です。場所へのアクセスは、アプリケーションが実行中(つまり、一時停止されていない)であり、十分な許可(つまり、WhenInUse許可があり使用中、またはAlways許可がある)であればいつでも許可されます。ただし、アプリは通常のタスク停止ルールの対象となります。

可能な許可値の詳細については、-requestWhenInUseAuthorizationおよび-requestAlwaysAuthorizationを参照してください。

ありがとう

15
Dipen

私は同じ問題を抱えていました。次のようなものを追加する必要があります。

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){

    [self.locationManager setAllowsBackgroundLocationUpdates:YES];

}

システムバージョンをチェックするためのマクロは次のようになります。

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

次のフォーラム投稿が私を助けてくれました。

https://forums.developer.Apple.com/thread/6895

7
mkabatek

新しいメソッドはlocationManager-> requestLocation()see https://developer.Apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ また、allowsBackgroundLocationUpdates(iOS9のみ)を追加しました。

2
user3344236