按Home(主页)按钮可使GPS保持运行几分钟

时间:2013-02-03 23:52:36

标签: ios gps background-process cllocation home-button

我有一个带有区域监控功能的应用程序,但为了更好的预感,当用户进入指定的区域时,我会调用“startUpdatingLocation”来使用GPS:

  - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
   [manager startUpdatingLocation]; 
}



-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
locationManager =manager;

     CLLocation *location1 = locationManager.location;
     CLLocation *location2 = [[CLLocation alloc] initWithLatitude:obj.latitude longitude:obj.longitude];
    float betweenDistance=[location1 distanceFromLocation:location2];


    if((betweenDistance/1000)<=0.350000){
            // Fires an UIAlert
     }

}

在大多数情况下都能正常工作,例如,如果用户在区域外,然后按“主页按钮”,进入该区域后会触发“didEnterRegion”功能,GPS开始工作一些分钟并显示警报,这是正确的方式。

但是如果应用程序处于打开状态,然后用户输入该区域,则会触发“didEnterRegion”功能并启动GPS,但如果用户在此时按下“主页按钮”,GPS将停止并且警报永远不会出现。

我不想在info.plist中激活“必需的背景模式”选项,因为我只想在用户按下主页按钮后几分钟使用GPS,而不是在excesive中使用模式。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

当您的应用程序委托获取消息applicationWillResignActive时:您可以通过创建如下请求来请求操作系统保持您的应用程序运行:

UIBackgroundTaskIdentifier taskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    // do you cleanup in here if your background task gets terminated by the system
}];

之后,您的事件循环将继续运行,您将继续接收正常情况(除了您的应用程序窗口不可见,因此您显然不会接收触摸事件或其他与窗口相关的事件)。< / p>

一旦您不再需要继续运行,您就可以像这样发布您的请求

[[UIApplication sharedApplication] endBackgroundTask:taskID];

要完成所有工作,只需在应用代理中添加一个标记,以便在您执行需要更多时间的操作时通知它。然后,当您的委托获取applicationWillResignActive:消息时,它可以检查该标志,如果已设置,则请求一些后台时间继续运行。