iOS7核心位置未更新

时间:2013-10-16 00:42:08

标签: objective-c ios7 core-location cllocationmanager

我有一个非常简单的应用程序示例,用于初始化和更新用户位置。在设备上,它每秒都会成功抛出另一个回调位置,但是在设备上(运行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 个答案:

答案 0 :(得分:12)

这里有一些事情:

1-我没有看到任何地方:pausesLocationUpdatesAutomatically。此属性的默认值为Yes。这意味着,根据您的活动类型(参见下面的#2),GPS将暂停更新,这可能是您没有获得更新的原因。该算法是一个只有Apple知道的黑盒子,也许它在iOS6和iOS7之间有所改变。将pausesLocationUpdatesAutomatically设置为NO会影响电池。

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

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

在iOS7中不推荐使用4- locationManager didUpdateToLocation fromLocation。此外,如果实现了locationManager didUpdateLocations,则不会调用前者。所以在上面的例子中,没有调用locationManager didUpdateToLocation fromLocation。

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

所以我首先设置activityType,将pausesLocationUpdatesAutomatically设置为NO并将desiredAccuracy更改为kCLLocationAccuracyBestForNavigation。一旦获得持续更新,我就会将pausesLocationUpdatesAutomatically设置为Yes并尝试使用代码来实现相同的应用程序可用性。

希望这有帮助