位置服务不适用于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)
将失败默默。
以德语翻译为例:
希望这可以节省你的时间磕磕绊绊。