我试图使用一些花哨的iBeacons但没有成功,kCLAuthorizationStatusNotDetry一直都是。 根据其他问题,要求将这些密钥添加到info.plist(有些问题说一个,另一个问题说两者都有)。根据iBeacons的一篇文章,我需要Always选项。
<key>NSLocationWhenInUseUsageDescription</key>
<string>Nothing to say</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Permiso para acceder siempre</string>
在viewDidAppear:
self.locManager = [[CLLocationManager alloc]init];
self.locManager.delegate = self;
[self.locManager requestAlwaysAuthorization];
NSUUID* region1UUID = [[NSUUID alloc]initWithUUIDString:@""]; //ibeacon real UUID between "". Checked it's not nil.
self.beaconRegion = [[CLBeaconRegion alloc]
initWithProximityUUID:proximityUUID
identifier:@"myCoolString"];
self.beaconRegion.notifyEntryStateOnDisplay = YES;
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = NO;
[self.locManager startMonitoringForRegion:self.beaconRegion];
[self.locManager startRangingBeaconsInRegion:self.beaconRegion];
图标没有出现在“设置/隐私/位置”中,直到它执行了最后两种方法之一。永远不会出现批准权限的警报视图。 如果我在“位置设置”中执行手动更改并进行检查,则会更改状态,但过了一会儿,“设置”中的位置将删除&#34;始终&#34;我的应用的状态,将再次留空。后来我没有运气检查
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
任何想法缺失或错误?谢谢
答案 0 :(得分:34)
对于iOS 11开发人员,您应该看一下这篇文章:Location Services not working in iOS 11。
TL; DR:您需要Info.plist中的所有三个位置键:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
在多语言应用的情况下,InfoPlist.strings
翻译。
答案 1 :(得分:19)
有完全相同的问题。
事实证明,在我的情况下,我的NSLocationAlwaysUsageDescription
本地化文件中也需要InfoPlist.strings
。在NSLocationAlwaysUsageDescription
中Info.plist
是不够的......
答案 2 :(得分:13)
我注意到如果在警报显示之前销毁了CLLocationManager实例,您将永远不会看到警报。 在我的例子中,我在AppDelegate中创建了一个位置管理器的局部变量来请求权限。
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[locationManager requestAlwaysAuthorization];
}
将局部变量更改为实例变量使警报显示:
@interface AppDelegate () {
CLLocationManager *_locationManager;
}
@end
_locationManager = [[CLLocationManager alloc] init];
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[_locationManager requestAlwaysAuthorization];
}
答案 3 :(得分:3)
尝试开始更新位置(对我有帮助)
[self.locationManager startUpdatingLocation];
答案 4 :(得分:3)
最近我尝试使用IOS 11时遇到类似的问题
locationManager.requestAlwaysAuthorization()
对我来说,解决方案是在plist.info中添加所有4个权限以获取警报:
答案 5 :(得分:2)
发现,在论坛上记录并测试它是与Objective-C iOS 8相关的错误。 用Swift写的相同代码就可以了。使用swift代码,代理就是调用。
添加核心位置框架 项目设置/目标/功能/背景模式设置“位置更新”和“使用蓝牙LE配件” 在Info.plist上添加密钥NSLocationAlwaysUsageDescription
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var locManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
self.locManager = CLLocationManager();
self.locManager!.delegate = self;
if (!CLLocationManager.locationServicesEnabled()) {
println("Location services are not enabled");
}
self.locManager!.requestAlwaysAuthorization();
self.locManager!.pausesLocationUpdatesAutomatically = false;
let uuidString = "" // My ibeacon string there
let beaconIdentifier = "myCompany"
let beaconUUID:NSUUID = NSUUID(UUIDString: uuidString)
let beaconRegion:CLBeaconRegion = CLBeaconRegion(proximityUUID: beaconUUID,
identifier: beaconIdentifier)
self.locManager!.startMonitoringForRegion(beaconRegion)
self.locManager!.startRangingBeaconsInRegion(beaconRegion)
self.locManager!.startUpdatingLocation()
}
对话框显示确定
答案 6 :(得分:2)
确保将密钥添加到正确的Info.plist文件中。不要忘记有一个适用于您的App,另一个适用于AppTest。
答案 7 :(得分:2)
Swift 3.X最新代码轻松使用
import CoreLocation
public var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let altitudeG = locations.last?.altitude
let longitudeG = locations.last?.coordinate.longitude
let latitudeG = locations.last?.coordinate.latitude
print("\(altitudeG) \(longitudeG) \(latitudeG)")
}
答案 8 :(得分:1)
对于ios 11,重要的是在下面添加新的权限,
NSLocationAlwaysAndWhenInUseUsesDescription
以及旧的许可
NSLocationAlwaysUsageDescription,NSLocationWhenInUseUsageDescription
解决requestAlwaysAuthorization不显示权限警报的问题。
答案 9 :(得分:1)
与硬件相关的系统问题?
iOS 13.1.3,iPhone 7(型号“ iPhone9,1”)
似乎类似于系统设置->隐私->位置,即使在删除应用程序之后(至少在同一iOS会话中,并针对指定配置),缓存权限也是如此。
如果按下“允许一次”,并且用户删除并重新安装并再次运行该应用程序,则didChangeAuthorizationStatus(_ :)将发送初始状态.denied。 (因此,根据CLLocationManager逻辑,它在requestAlwaysAuthorization()之后不显示提示警报)。 在这种情况下,这种被拒绝的身份是邪恶的根源。
如果用户在初始的didChangeAuthorizationStatus( :)和requestAlwaysAuthorization()之间折叠应用程序,则将导致下次更新didChangeAuthorizationStatus( :)且状态为.denied以外的其他提示,并显示提示。
>iOS 13.1.3,iPhone 7(型号ID为“ iPhone9,3”)-无法重现该问题。 (收到的初始状态为.notDefineded)
iOS 13.1.2 iPhone 8-一切正常,与上面相同
答案 10 :(得分:0)
我复制了这个教程......
http://willd.me/posts/getting-started-with-ibeacon-a-swift-tutorial
虽然解决方法非常简单,但没有宣布它没有解决问题。让locationManager = CLLocationManager()
但是将它作为变量
移入类中var locationManager = CLLocationManager()
它有效!!
答案 11 :(得分:0)
如果您的应用的位置权限未设置,则会显示提示,并且在使用时会显示一次提示&#39;您的应用的位置权限已设置,后续通话未显示(并且我不认为有任何API反馈表明该通话被吞下)。
来自Apple docs:
讨论当前授权状态未确定时, 此方法异步运行并提示用户授予 应用程序使用位置服务的权限。用户提示 包含NSLocationAlwaysUsageDescription键中的文本 您的应用的Info.plist文件,并且需要存在该密钥 在调用此方法时。确定状态后,位置 经理将结果传递给代表 locationManager(:didChangeAuthorization :)方法。如果是当前的 授权状态是不确定的,这个方法 什么都不做,也没有打电话给 locationManager(:didChangeAuthorization :)方法,有一个例外。 如果您的应用从未要求始终授权及其当前 授权状态授权在使用时,您可以调用此方法 方法一次尝试将您的应用程序的授权状态更改为 授权总是。
答案 12 :(得分:0)
请检查此Reference link
它描述了有关iOS 11的所有更改。您的问题似乎也是其描述的案例之一。它可能会让您了解需要在代码中进行哪些更改以纠正问题。
答案 13 :(得分:0)
在iOS 13上,对于我来说,我必须重置模拟器才能再次触发权限提示。
答案 14 :(得分:0)
要添加:确保已将数组 UIBackgroundModes 添加到 .plist 并插入“位置”值。
Apple 不会告诉您它已丢失,而是提供给您 WhenInUse。
总结:
答案 15 :(得分:-1)
最近,IOS 13 *在用户重新安装应用后保存结果请求权限