0

如果用户在应用程序处于后台模式时进入或退出区域,我需要执行调用 localNoification 的简单任务。只有一组坐标会触发通知。例如:

纬度:41.8500 经度:87.6500 半径:300

我知道如何调用 localNotification,以及如何使用 locationManager 的基本功能,但似乎无法在后台跟踪位置。任何帮助都会很棒!

4

2 回答 2

3

你读过 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 秒。

于 2013-01-20T23:32:39.993 回答
2

看看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;
    });
}
于 2013-01-20T23:17:17.130 回答