iOS7 核心位置未更新



我有一个非常简单的应用程序示例,用于初始化和更新用户位置。在设备上,它每秒左右成功抛出另一个回调位置,但是在设备上(运行iOS7的iPhone)调用该方法一次,然后神秘地停止...

//Setup Location Manager in ViewDidLoad
locationManager = [[CLLocationManager alloc] init];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDelegate:self];
[locationManager startUpdatingLocation];
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
     NSLog(@"location services not turned on");
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
     NSLog(@"loactions %@", locations);
}
-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"new location %f, and old %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}

在iOS6中,此应用程序运行良好,并不断更新设备位置...自 iOS7 以来发生了哪些变化?

这里有

几件事:

1-我在任何地方都看不到该属性:暂停位置更新自动。此属性的默认值为"是"。这意味着根据您的活动类型(请参阅下面的#2),GPS将暂停更新,这可能是您没有获得更新的原因。该算法是一个只有苹果知道的黑匣子,也许它在iOS6和iOS7之间发生了某种变化。设置暂停位置更新自动更改为否会影响电池。

2-您应该根据您的应用程序设置活动类型。默认值是CLActivityTypeOther,我不确定它如何影响GPS算法和上面的#1。因此,为了最初测试您的应用程序,我会适当地设置 activityType 并将 pausesLocationUpdatesAuto 更改为 No。在我的测试中,我几乎每秒都会得到更新(我在一夜之间测试了它)。

3-位置更新测试需要移动。为了获得更好的结果,我会使用您设置的活动类型进行测试。换句话说,如果活动类型是CLActivityTypeFitness,我会四处走动测试它,等等。

4-locationManager didUpdateToLocation fromLocation在iOS7中被弃用。此外,如果实现了 locationManager didUpdateLocations,则不会调用前者。因此,在上述情况下,位置管理器确实更新到位置从位置没有被调用。

5-kCLLocationAccuracyBestForNavigation和kCLLocationAccuracyBest之间没有真正的电池使用差异。另一方面,kCLLocationAccuracyBestForNavigation使用最高速度GPS,并将其与加速度计数据相结合。

因此,我将从设置活动类型开始,将暂停位置更新自动设置为NO,并将所需精度更改为kCLLocationAccuracyBestForNavigation。一旦您获得持续更新,那么我会将暂停位置更新自动设置为是,并尝试使用代码来实现相同的应用程序可用性。

希望这有帮助

最新更新