iPhoneアプリケーションでは、位置情報を取得する権限を持つアプリケーションがバックグラウンドで実行されていない場合でも、位置情報を追跡してサーバーに送信することはできますか?
2 に答える
これは可能です—マルチタスク全般についてはこのドキュメントを、「バックグラウンドでのロケーションイベントの取得」についてはロケーション認識プログラミングガイドのこのセクションを参照してください。もちろん、これらはすべて、排他的なGPSではなく、iOSデバイスが現在地を取得できるさまざまな方法(セルタワーの三角測量、Skyhookスタイルのwifiネットワーク観測およびGPS)のすべてについて説明しています。
つまり、これらのドキュメントを読んでから、UIBackgroundModesキーを配列であるinfo.plistに追加し、値「location」をその中に入れます。その後、バックグラウンドでもCLLocationManagerの更新を受信します。
ただし、バッテリーを使いやすくしたい場合は、CLLocationManagerでstartMonitoringSignificantLocationChangesメソッドを使用することをお勧めします。そうすれば、バックグラウンドアプリでいっぱいになることなく、バックグラウンドにいるときでも、適切に重要な位置情報の更新を取得できます。ドキュメントの他の部分では、重要な変更は、あるセルタワーから別のセルタワーへの変更であると述べています。
アプリがバックグラウンドにある場合は、info.plistにキーと値のペアを追加できます。キーはUIBackgroundModes
であり、値は次のようになります:
次に、バックグラウンドで何かを行います:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
UIDevice *device = [UIDevicecurrentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
backgroundSupported = YES;
}
__blockUIBackgroundTaskIdentifier bgTaskId = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTaskId];
bgTaskId = UIBackgroundTaskInvalid;
}];
if (backgroundSupported) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//
});
}
}
しかし、アプリがバックグラウンドでも、つまりメモリでもない場合、アプリは何ができるでしょうか?CPUはアプリのコード行を実行しませんでした。