如果用户在应用程序处于后台模式时进入或退出区域,我需要执行调用 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;
});
}