iOS:跟踪用户位置

时间:2015-10-29 19:02:37

标签: ios objective-c cllocationmanager

我在许多应用中使用了位置服务,但这个新应用在iOS 8.0及更高版本上存在问题。我没有收到应用程序首次加载提示允许位置服务的通知。但是,在我的iOS 7.1设备上,我收到提示。

以下是我在appDelegate的didFinishLaunchingWithOptions中所拥有的内容:

self.locationManager = [CLLocationManager new];
[self.locationManager setDelegate:self];
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

[self initializeRegionMonitoring];

initializeRegionMonitoring方法是:

-(void) initializeRegionMonitoring {

NSLog(@"initialize region monitoring");

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

// radius of region being monitored
CLLocationDistance radius = 25; // 20 metre sensitivity
CLLocationCoordinate2D coordinate;
coordinate.latitude = 25.886099;
coordinate.longitude = -80.165124;

self.someRegion = [[CLCircularRegion alloc] initWithCenter:coordinate radius:radius identifier:@"Qualex"];
self.someRegion.notifyOnEntry = YES;
self.someRegion.notifyOnExit = YES;
[self.locationManager startMonitoringForRegion:self.someRegion];

// notify changes when the device has moved x meters
self.locationManager.distanceFilter = 20; // or set to 20 meters
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
[self.locationManager startUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
}

我也在我的info.plist中设置了NSLocationAlwaysUsageDescription,所以必须有一些我已经忘记的东西,对吧?谢谢你的帮助!

修改

我还同时注册了远程通知,之前从未出现过问题,但我认为这可能是一些有用的额外信息。

此外,当应用程序终止时,重新运行通知以允许弹出位置服务,但会立即消失。只是在屏幕上闪烁。我不知道为什么不点击警报上的其中一个选项就会解雇。

1 个答案:

答案 0 :(得分:2)

在iOS 8之前,您只需通过实例化CLLocationManager对象并尝试启动位置跟踪来请求位置权限。在iOS 8及更高版本中,这不会显示权限提示;您必须使用requestAlwaysAuthorizationrequestWhenInUseAuthorization方法手动申请授权。

话虽如此,在iOS 8上,如果您调用其中任何一种方法,那么释放您调用它的CLLocationManager实例,位置权限提示将自行解除。这里发生的是您正在创建位置管理器,请求权限(iOS开始尝试呈现权限对话框),调用initializeRegionMonitoring,并将self.locationManager属性设置为新的位置管理器实例。这会导致您创建的第一个被ARC释放,因此在有机会出现之前,权限提示会被取消。

删除self.locationManager = [[CLLocationManager alloc] init];方法中的行initializeRegionMonitoring应该可以解决问题。