アプリがバックグラウンドに移行するとき、ユーザーの現在地の更新を取得し続ける必要があります。Apple のドキュメントで見つけたように、これは実装が許可されている長時間実行されるバックグラウンド タスクの 1 つです。また、場所の更新が通知されたときにサーバーに情報を送信するために、処理とネットワーク呼び出しを行う必要があります。私がやろうとしていることは、大まかに言えば、次のようなものです。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Background task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Background time remaining: %f seconds (%d mins)",
[[UIApplication sharedApplication] backgroundTimeRemaining],
(int)([[UIApplication sharedApplication] backgroundTimeRemaining] / 60));
// Need to get data from database here
// Finished
if (bgTask != UIBackgroundTaskInvalid) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
// Start location manager
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]) {
locationManager.delegate = self;
locationManager.distanceFilter = 20;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Want to perform some data processing here, including concurrent tasks
// and several network calls to get and send data to server
[self locationProcessingCompleted];
});
}
- (void)locationProcessingCompleted
{
// Check results. If needed, some more data processing and several network
// calls to send data to server
// Close background task
if (bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
位置情報サービスに関する長期実行バックグラウンド タスクのコード例が見つかりません。それについていくつか質問があります。
a)dispatch_async
キュー内のすべてのバックグラウンド コードを実行する必要がありますか? つまり、ロケーション マネージャーの設定を含め、すべてのコードがapplicationDidEnterBackground:
非同期で実行されるのでしょうか。
b)[[UIApplication sharedApplication] backgroundTimeRemaining]
非常に長い値を返しています。今回は10分くらいじゃないの?
didUpdateToLocation:
c) やりたいこと: 最初の有限長のタスクを実行し、位置の更新を開始し、トリガーされるたびに他の有限長のタスクを実行します。inのlocation
値を設定しました。私のアプローチは正しいですか?場所を無期限に更新し続け、更新を受信するたびに 10 分未満の限られた長さのタスクを実行できますか?UIBackgroundModes
Info.plist
この問題について助けが必要です。前もって感謝します