2

我有一个带有区域监控的应用程序,但为了更好的定位,当用户进入指定的区域时,我调用“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 几分钟,而不是在过度模式下使用。

有任何想法吗?

4

1 回答 1

2

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

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

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

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

[[UIApplication sharedApplication] endBackgroundTask:taskID];

为了让这一切正常工作,只需向您的应用程序委托添加一个标志,以便在您执行需要更多时间的操作时通知它。然后,当您的代理收到 applicationWillResignActive: 消息时,它可以检查该标志,如果已设置,则请求一些后台时间以继续运行。

于 2013-02-04T03:03:36.583 回答