【问题标题】:iOS7 Core Location not updatingiOS7核心位置未更新
【发布时间】:2013-10-23 23:30:44
【问题描述】:

我有一个非常简单的应用程序示例,它初始化和更新用户位置。在设备上,它每秒左右成功抛出另一个回调位置,但是在设备(运行 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 以来发生了什么变化?

【问题讨论】:

  • didUpdateLocations 方法是否触发?
  • 它的触发但只有一次......
  • 你在这个方法中是否调用了stopUpdatingLocation?
  • 是的,我似乎通过将 DesiredAccuracy 更改为 BestForNavigation 来解决问题...
  • 可能这不是解决方案,但委托方法 locationManager:didUpdateToLocation:fromLocation: 自 ios6 以来已弃用,如果您未部署在低于 ios6 的设备上,则不需要。

标签: objective-c ios7 core-location cllocationmanager


【解决方案1】:

这里有几件事:

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

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

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

4- locationManager didUpdateToLocation fromLocation 在 iOS7 中已弃用。另外如果实现了locationManager didUpdateLocations,则不会调用前者。所以在你上面的例子中,locationManager didUpdateToLocation fromLocation 没有被调用。

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

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

希望对你有帮助

【讨论】:

  • 如果我将我的应用程序置于后台,步行到 POINT A,然后停止移动 20 分钟会怎样。然后我再次开始移动到 B 点。在这段时间内,应用程序仍处于后台。当我以前台模式重新打开我的应用程序时,didUpdateLocations 会给我 POINT A 和 POINT B 之间的所有位置吗?
  • 不,不会,GPS芯片接收到的位置会直接通过locationManager:didUpdateLocations方法传递。因此,如果您想存储位置路径,则必须在收到它们时直接存储它们。
猜你喜欢
  • 2014-12-22
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多