フォアグラウンドで実装できるユース ケースはごくわずかです。審査中にアプリケーションが拒否されたくない場合は、ハックを使用しないでください。もちろん、バックグラウンドで NSTimer を使用することもできますが、バックグラウンド タスクのスレッド (runloop) で作成する必要があります。ただし、このバックグラウンド タスクは一定の時間しか存在しないため、タイマーはこの期間中に起動する必要があります。つまり、最初の目標はバックグラウンド タスクを作成することであり、そうして初めてタイマーを使用できるようになります。目的に適した (このタスクを作成できる) 場合はほとんどありません。なので参考にしてください
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"BG fetch in action");
//the only 30 sec is allowed to perform all your actions
//during this period you can each second track GPS data
[self performSelector:@selector(finishBackgroundFetch:) withObject:completionHandler afterDelay:27];
[[NSNotificationCenter defaultCenter] postNotificationName:@"StartMyGPSRoutine" object:nil];
}
-(void)finishBackgroundFetch:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"BG fetch completion handler");
[[NSNotificationCenter defaultCenter] postNotificationName:@"ForceStopAnyBackgroundTaskCreatedWithStartMyGPSRoutine" object:nil];
completionHandler(UIBackgroundFetchResultNewData);
}
アプリケーション デリゲートの - これは、重要な場所の変更を監視するだけでなく、あなたの場合に役立ちます。あなたはどこにでも置くべきです:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(setMinimumBackgroundFetchInterval:)]) {
NSLog(@"Set Force BG interval to %ld", interval);
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:interval];
}
私の場合、5 分ごとに GPS データをフェッチするので、このタスクを完了するのに 27 秒はそれほど長くありません。とにかく、XCode を使用して時間間隔で遊ぶことができます。Main Menu->Debug->Simulate Background Fetch を参照してください。