我一直在网上遇到这个令人头痛的问题,所以我决定在这里问一下。
我正在尝试创建当用户从我上次收到位置(重复)移动X米时收到通知的能力。
每次收到该位置,我都会将其推送到我的服务器。
我已经使用CLLocationManager
设置了它,但它仅在应用程序位于前台/后台时才有效,但在应用程序处于非活动状态时却无效(用户在双击主页时通过滑动移除应用程序)。
我尝试在[locationManager startUpdatingLocation]
中使用didFinishLaunchingWithOptions:
。
我尝试使用[locationManager startUpdatingLocation]
和以前一样,但是当我收到第一个位置时,我开始使用区域监视器,因为据我在网上了解,只有地理围栏可以在应用程序处于非活动状态时接收通知。
我为required Background Modes
添加了app registers for location updates
。
还尝试将Application does not run in the background
添加到NO
。
查看服务器时,我会在应用程序处于活动状态(UIApplicationState == 0)/ background(UIApplicationState == 2)时收到通知,但不会收到UIApplicationState == 1(非活动状态)的通知。 这是我的参考代码:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *lastLocation = locations.lastObject;
[self saveToServer];
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringForRegion:[[CLCircularRegion alloc] initWithCenter:lastLocation.coordinate radius:20 identifier:@"20"]];
}
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
}
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
CLLocation *lastLocation = manager.location;
if(lastLocation)
{
[self saveToServer];
[self.locationManager startMonitoringForRegion:[[CLCircularRegion alloc] initWithCenter:lastLocation.coordinate radius:20 identifier:@"20"]];
}
}
- (CLLocationManager *)locationManager
{
if (_locationManager != nil) {
return _locationManager;
}
_locationManager = [[CLLocationManager alloc] init];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
_locationManager.distanceFilter = 20;
_locationManager.pausesLocationUpdatesAutomatically = NO;
[_locationManager setDelegate:self];
return _locationManager;
}
谢谢。
答案 0 :(得分:0)
iOS 7不会为多任务切换器手动终止的应用重启后台服务。用户需要通过点击主屏幕上的图标手动启动应用程序以恢复位置服务。
观看WWDC 2013会话307:https://developer.apple.com/wwdc/videos/