アプリがバックグラウンド モードのときにユーザーが領域に出入りする場合は、localNoification を呼び出すという簡単なタスクを実行する必要があります。単一の座標セットのみが通知をトリガーします。例えば:
緯度: 41.8500 経度: 87.6500 半径: 300
localNotification を呼び出す方法と、locationManager の基本機能を使用する方法は知っていますが、バックグラウンドで場所を追跡できないようです。どんな助けでも素晴らしいでしょう!
アプリがバックグラウンド モードのときにユーザーが領域に出入りする場合は、localNoification を呼び出すという簡単なタスクを実行する必要があります。単一の座標セットのみが通知をトリガーします。例えば:
緯度: 41.8500 経度: 87.6500 半径: 300
localNotification を呼び出す方法と、locationManager の基本機能を使用する方法は知っていますが、バックグラウンドで場所を追跡できないようです。どんな助けでも素晴らしいでしょう!
CLLocationManager のstartMonitoringForRegion:
メソッドを読みましたか? これはまさにあなたが望むことをすると思います。設定するコードは次のようになります。
CLRegion * region = [[CLRegion alloc] initCircularRegionWithCenter: CLLocationCoordinate2DMake(41.8500, 87.6500) radius: 300 identifier: @"regionIDstring"];
CLLocationManager * manager = [[CLLocationManager alloc] init];
[manager setDelegate: myLocationManagerDelegate];
[manager startMonitoringForRegion: region];
その後、アプリがバックグラウンドにある場合でも、デバイスは指定された領域への出入りを監視します。リージョンを超えると、デリゲートはコールlocationManager:didEnterRegion:
またはを受け取りますlocationManager:didExitRegion:
。この機会にぜひ投稿してみてUILocalNotification
ください。リージョンをまたいだときにアプリが実行されていない場合、アプリはバックグラウンドで起動されるため、 で適切なキーを探す必要がありますapplication: didFinishLaunchingWithOptions:
。次のようなコードを使用します。
if ([launchOptions objectForKey: UIApplicationLaunchOptionsLocationKey] != nil) {
// create a location manager, and set its delegate here
// the delegate will then receive the appropriate callback
}
バックグラウンドで実行されている間、アプリが実行されるのは短時間 (数秒) だけであることに注意してください。より長いタスクを実行する必要がある場合はbeginBackgroundTaskWithExpirationHandler:
、アプリにリージョン クロッシングが通知された直後に、Nebs が回答で言及したメソッドを呼び出します。これにより、バックグラウンドでの実行に約 600 秒かかります。
beginBackgroundTaskWithExpirationHandler:
の方法をご覧くださいUIApplication
。アプリがバックグラウンドにあるときに、タスクを実行するための追加の時間をリクエストできます。
詳細については、 iOS アプリ プログラミング ガイドの「バックグラウンド実行とマルチタスク」セクションをお読みください。アプリがバックグラウンドになったときに何が起こるのか、何ができるのかを詳しく説明しています。
具体的には、アプリがバックグラウンドになったときに長いタスクを実行するサンプル コードを示します。
[このコードは、上記のリンク先の Apple ガイドから取得したものです]
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
// Clean up any unfinished task business by marking where you.
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}