自iOS 8以来,SignificantLocationChanges功能失效

3

自从iOS8发布以来,我在使用SignificantLocationChanges方法时遇到了问题。

[locationManager startMonitoringSignificantLocationChanges]; 

在检查可用性后正确调用,委托也很好地工作(我使用了didChangeAuthorizationStatus方法进行检查,该方法是相同委托和对象的一部分),编译器没有疑问,但是绝对没有更新和来自didFailWithError方法的错误。日志显示authorizationStatus为4,我认为这很好。

iOS 8之前,所有这些都很好用。

第一个测试设备(带3G的iPad 2)运行iOS 7.1.2,第二个设备(iPhone 5)运行8.0.2,当我使用正常的startUpdatingLocation方法时,我立即得到更新。但是,SignificantLocationChanges对我的工作来说会更好。有人知道错误可能出现在哪里吗?


也许展示一些代码。对我来说它运行良好。 - Paulw11
3个回答

5

在iOS 8中,您必须使用类型“Always”请求授权,以允许您的应用程序使用重要位置。

在您的-Info.plist文件中添加一个新行,其中键为NSLocationAlwaysUsageDescription enter image description here

然后,如果尚未请求,请请求授权。

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    if (status == kCLAuthorizationStatusNotDetermined && [manager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [manager requestAlwaysAuthorization];
    }
}

3
我也遇到了使用 startMonitoringSignificantLocationChanges 的问题。
我添加了 [self.locationManager requestWhenInUseAuthorization]; 并在plist文件中添加了 NSLocationWhenInUseUsageDescription 字符串。
当我运行应用程序时,所有工作都正常进行,didChangeAuthorizationStatus 委托方法被调用,但是没有活动传递给 didUpdateLocationdidFailWithError 委托方法。
但是当我切换到 startUpdatingLocation 时,它神奇地工作了!但我需要 startMonitoringSignificantLocationChanges 工作,因为我不想让我的应用程序消耗电池电量来处理我不需要的事件!
更新!!问题已解决!
哦,我现在明白为什么它不起作用了!新的 SDK 参考在这个链接中说:
“在使用位置服务之前,您必须调用此方法或 requestAlwaysAuthorization 方法。如果用户授予您的应用程序“在使用时”授权,则您的应用程序可以在前台启动大多数(但不是全部)位置服务。 (应用程序不能使用任何自动重新启动应用程序的服务,例如区域监视或重大位置更改服务。)”
因此,无法使用 [self.locationManager requestWhenInUseAuthorization]; 方法使用 startMonitoringSignificantLocationChanges。您必须使用 requestAlwaysAuthorization

不,你必须同时使用它们。已在iOS 10上进行测试。 - AndaluZ

0

你记得调用方法了吗?

-requestAlwaysAuthorization
(or -requestWhenInUseAuthorization)

你的CLLocationManager上吗?这是iOS 8中的新方法,并且在开始位置更新之前需要调用它。

另外,请仔细检查是否正在主线程上分配和调用-startUpdatingLocation。我不确定这一点,但我认为在不同的线程上调用它可能会引起问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接