我有一个带有区域监控功能的应用程序,但为了更好的预感,当用户进入指定的区域时,我会调用“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中使用模式。
有什么想法吗?
答案 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:消息时,它可以检查该标志,如果已设置,则请求一些后台时间继续运行。