バックグラウンドでアプリが位置情報を追跡しています...位置情報バックグラウンドモードが有効になっていて、
[self.locationManager startUpdatingLocation];
これはiOS7-8
しかしiOS9
シミュレーターでは機能しますが、実際のデバイスではバックグラウンドでコールバックが発生しません... iOS8デバイスで同じコードを実行すると、以前と同様に通常のコールバックが発生します
これは文書化されていますか?なぜデバイスではなくシミュレータで動作するのですか?それはバグですか?
startSignificantChangeUpdates
を使用する場合、iOS9で動作しますが、これは何らかのバッテリー節約機能であるか、startUpdatingLocationを禁止している可能性があります
使用する:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
システムバージョンを評価するマクロの使用を避けるため。これにより、iOS 9ではsetAllowsBackgroundLocationUpdates:が呼び出されますが、iOS 8では呼び出されません。
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を参照してください。
ありがとう
私は同じ問題を抱えていました。次のようなものを追加する必要があります。
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)
次のフォーラム投稿が私を助けてくれました。
新しいメソッドはlocationManager-> requestLocation()see https://developer.Apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ また、allowsBackgroundLocationUpdates(iOS9のみ)を追加しました。