位置服务不适用于iOS 11

我只是用iOS 11 SDK重build我的应用程序,试图删除现在总是出现的blue banner 。 我以为 – “很棒,这很有效”,只是发现位置服务现在根本不起作用。

曾经与iOS 10一起使用的应用程序 – 有没有人听过?

看来,苹果已经增加了另一个隐私function。 用户现在能够覆盖我们的requestAlwaysAuthorization并将其降级为requestWhenInUseAuthorization – 这意味着作为开发者,我们现在必须在Info.plist提供这两个描述

我发现他们已经添加了一个新的NSLocationAlwaysAndWhenInUseUsageDescription

 /* * Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the * NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription * keys must be specified in your Info.plist; otherwise, this method will do * nothing, as your app will be assumed not to support Always authorization. */ 

但是,使用这个新的密钥 – 位置服务仍然没有工作,经过进一步的search,我发现这个gem混合了所有额外的debugging信息:

这个应用程序试图访问隐私敏感的数据没有使用说明。 应用程序的Info.plist必须包含NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription键以及string值,向用户解释应用程序如何使用此数据

这与我在更新后的CLLocationManager.h文件中发现的评论直接矛盾。 所以我创造了一个雷达。

好消息是,如果你按照IE的debugging控制台的build议。 添加新的NSLocationAlwaysAndWhenInUseUsageDescription和旧的密钥NSLocationWhenInUseUsageDescription ,位置服务将开始再次工作。

只需要添加解决这个问题的步骤:

2种方式来做到这一点:

一)简单的方法:select你的Info.plist文件,添加属性,请注意,他们开始PRIVCY而不是LOCATION …因此,这些variables的确切名称以“隐私 – 位置…”等开头,添加每个在这里,并描述用户将如何看到这个警告。

B)困难/有趣/程序化的方式(我更喜欢这种方式):

右键单击您的应用程序的Info.plist,然后select“查看源代码”,您应该可以看到所有的XML文件,

按照其他……格式,并添加这些属性如下:

 <key>NSLocationAlwaysUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSMicrophoneUsageDescription</key> <string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string> 

保存,然后右键单击info.plist文件,然后select属性列表,这应该查看文件回到默认视图。

编辑:

另一位成员要求代码,这里是:

1)在您的.H文件中,添加:

 @property (strong, nonatomic) CLLocationManager *LocationManager; 

2)在.M文件中添加ViewDidAppear()函数:

 _LocationManager = [[CLLocationManager alloc] init]; [_LocationManager setDelegate:self]; _LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; _LocationManager.pausesLocationUpdatesAutomatically = NO; [_LocationManager requestAlwaysAuthorization]; _LocationManager.headingFilter = 5; _LocationManager.distanceFilter = 0; [_LocationManager startUpdatingLocation]; [_LocationManager startUpdatingHeading]; 

这对我来说很好,希望代码也适合你。

问候

海德

在iOS11下工作我发现,Info.plist至less需要NSLocationAlwaysAndWhenInUseUsageDescription在Info.plist中:

在这里输入图像说明

当你的应用程序是多语言的足够奇怪,你的string的本地化版本需要在这篇文章中提到的所有三个键否则requestAlwaysAuthorization()locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)将失败默默。

以德语翻译为例:

在这里输入图像说明

希望这可以节省你的时间磕磕绊绊。

Interesting Posts