2

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

4

2 回答 2

5

这是可能的——请参阅本文档以了解一般的多任务处理以及位置感知编程指南的本节“在后台获取位置事件”。当然,所有这些都在谈论 iOS 设备获取您位置的所有各种方式(手机信号塔三角测量、Skyhook 式 wifi 网络观测和 GPS),而不是唯一的 GPS。

简而言之,通过阅读这些文档:将 UIBackgroundModes 键添加到 info.plist 中,这是一个数组,并将值“位置”放入其中。即使在后台,您也会收到 CLLocationManager 更新。

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

于 2013-02-21T03:07:28.330 回答
3

如果 App 在后台,可以在 info.plist 中添加键值对。关键是UIBackgroundModes,值如下:

在此处输入图像描述

然后在后台做一些事情:

- (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 不会运行应用程序的一行代码。

于 2013-02-21T03:31:56.270 回答