我试着让我的AppProject iOS 8做好准备。我读过很多关于
的文章[_locationManager requestWhenInUseAuthorization];
和plist中的条目
NSLocationWhenInUseUsageDescription
所以我改变了所有必要的代码行。
它工作正常,但现在我已经从我的iOS 7基础复制了我的项目以包含新功能。但是,当我对iOS8位置隐私进行更改时,Popup不再出现。
我的代码一直有效,直到我复制。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>tolle sache </string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
这是我的电话
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
_UserLocation = [[CLLocation alloc]init];
_locationManager = [[CLLocationManager alloc]init]; // initializing locationManager
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy
[_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST
[_locationManager startUpdatingLocation]; //requesting location updates
NSLog(@"passed initwithcode");
}
return self;
}
我该如何解决这个问题?
答案 0 :(得分:101)
来自文档
NSLocationWhenInUseUsageDescription(String - iOS)描述了 应用程序在运行时正常访问用户位置的原因 在前台。当您的应用使用位置时,请包含此密钥 用于直接跟踪用户当前位置的服务。这把钥匙呢 不支持使用位置服务来监控区域或监控区域 用户使用重要位置更改服务的位置。该 系统在显示的警报面板中包含此键的值 用户在请求使用位置服务的权限时。
使用requestWhenInUseAuthorization时需要此密钥 CLLocationManager类的方法,用于请求授权 位置服务。 如果您拨打电话时钥匙不存在 requestWhenInUseAuthorization方法不包含此键, 系统会忽略您的请求。
iOS 8.0及更高版本支持此密钥。如果你的Info.plist文件 包括此密钥和NSLocationUsageDescription密钥, system使用此密钥并忽略NSLocationUsageDescription密钥。
了解它here。
我发现将此密钥添加到info.plist的最简单方法是右键单击info.plist并选择
打开As-&gt;源代码
然后在 </dict></plist>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
如果您愿意,可以在<string></string>
之间添加一个文本,向用户描述您为什么要使用他/她的位置。此文本将显示在警报中的默认文本下。
答案 1 :(得分:19)
尝试在Info.plist中编写NSLocationWhenInUseUsageDescription
答案 2 :(得分:10)
iOS 8.3,Xcode 6.3.1,启用了ARC
这个问题已经解决,但我有(2)从我最近参与CLLocationManager中添加的注意事项。
1)您必须在* .plist文件中输入以下密钥:
最常用的密钥具有通用的更具描述性的名称,例如“隐私 - 位置使用说明”,它实际上是“NSLocationUsageDescription”密钥。
要查看“原始”键名称,请转到“* -Info.plist”并右键单击列出键的导航器区域,如下所示:
你得到以下结果:
与本文相关的三个键是:
2)在尝试请求授权或更新位置之前,请确保分配并初始化CLLocationManager的实现。
*。h file:
@interface SomeController : UIViewController <CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
* .m file:
- (IBAction)locationButton:(UIButton *)sender
{
if (self.locationManager == nil)
{
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
}
else
{
nil;
}
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[self.locationManager requestWhenInUseAuthorization];
}
else
{
nil;
}
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.locationManager startUpdatingLocation];
}
希望这能节省时间!感谢。
答案 3 :(得分:3)
这里有点陷阱。确保您将NSLocationAlwaysUsageDescription或NSLocationWhenInUseUsageDescription键添加到主束plist而不是您的测试目标plist之一!
答案 4 :(得分:1)
由于我在方法中的局部变量中实例化stdio.h
而导致同样的问题,解决了它使CLLocationManager
成为类属性。
过了一会儿,我在这里找到了解决方案,但是我将它留在这里,因为这是谷歌的第一个结果,希望我能节省你一些时间:
答案 5 :(得分:0)
与Apple Watch有关:
您需要将requestWhenInUseAuthorization
密钥放入iPhone的Info.plist
,而不是WatchKit应用程序。
现在已经咬了我两次。