是否可以跟踪位置,即使应用程序没有运行

时间:2013-02-21 03:04:03

标签: iphone ios objective-c ios5 ios6

在iPhone应用程序中,即使具有定位权限的应用程序未在后台运行,也可以跟踪位置并将其发送到服务器。

2 个答案:

答案 0 :(得分:5)

这是可能的 - 请参阅this document了解一般的多任务和section of the Location Awareness Programming Guide for "Getting Location Events in the Background"。当然,所有这些都谈论了iOS设备可以获得您所在位置的所有方式(手机信号塔三角测量,Skyhook风格的wifi网络观测和GPS),而非独家GPS。

简而言之,从阅读这些文档:将UIBackgroundModes键添加到info.plist(这是一个数组)中,并将值'location'添加到其中。然后,即使在后台,您也会收到CLLocationManager更新。

但是,如果你想对电池感觉不错,那么最好在CLLocationManager上使用startMonitoringSignificantLocationChanges方法。然后,即使在后台没有完整的后台应用程序,您也可以获得适当的重要位置更新。文件的其他部分指出,重大变化是从一个牢房塔到另一个蜂窝塔的任何变化。

答案 1 :(得分:3)

如果应用程序在后台,您可以在info.plist中添加键值对。关键是UIBackgroundModes,值如下所示:

enter image description here

然后在后台做点什么:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    UIDevice *device = [UIDevicecurrentDevice];
    BOOL backgroundSupported = NO;
    if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
        backgroundSupported = YES;
    }

    __blockUIBackgroundTaskIdentifier bgTaskId = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:bgTaskId];
        bgTaskId = UIBackgroundTaskInvalid;
    }];

    if (backgroundSupported) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //
        });
    }
}

但是如果应用程序甚至不在后台,即不在内存中,那么该应用程序可以做什么? CPU不会运行该应用程序的代码行。