requestAlwaysAuthorization未显示权限警报

时间:2014-09-23 21:37:34

标签: ios core-location ibeacon

我试图使用一些花哨的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 {

任何想法缺失或错误?谢谢

16 个答案:

答案 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。在NSLocationAlwaysUsageDescriptionInfo.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。

总结:

  • 通过 .plist 告诉系统您的后台模式(必需的后台模式 > 应用注册位置更新)
  • 告诉位置管理器您希望在后台接收更新 (self.locationManager.allowsBackgroundLocationUpdates = YES;)
  • 从实例变量中请求用户许可 ([self.locationManager requestAlwaysAuthorization])
  • 为此请求提供有效文本(info.plist 包含:NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription、NSLocationAlwaysAndWhenInUseUsageDescription)

答案 15 :(得分:-1)

最近,IOS 13 *在用户重新安装应用后保存结果请求权限