【问题标题】:requestAlwaysAuthorization not showing permission alertrequestAlwaysAuthorization 未显示权限警报
【发布时间】:2014-11-18 06:02:10
【问题描述】:

我正在尝试使用一些花哨的 iBeacons,但一直没有成功,kCLAuthorizationStatusNotDetermined。 根据其他问题,需要将这些键添加到 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];

在执行最后两种方法之一之前,图标不会出现在“设置/隐私/位置”中。用于批准权限的警报视图永远不会出现。 如果我在位置设置中执行手动更改并检查它,它将更改状态,但稍后设置中的位置将删除我的应用程序的“始终”状态,并将其再次留空。后来我检查没有运气

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {

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

【问题讨论】:

  • 检查隐私 -> 位置服务,并确保您的应用没有禁用它。一旦明确禁用,将不会提示用户。尝试从设备中删除您的应用并重新安装
  • 我已尝试重新安装几次。该过程是当应用程序中没有出现对话框时,我转到设置/隐私/位置并检查为“始终”,几秒钟后它会变成完整的紫色图标。然后我回家,回到设置应用程序,瞧,我的应用程序仍然存在,但“总是”又是空白的
  • 听起来您的设备出了点问题。你有其他可以测试的设备吗?还是模拟器?
  • 我已经在我的手机和 ipad 上测试过,两者的行为都是一样的。也尝试过这种情况:设备已连接。在设置中设置“始终”选项,运行应用程序,然后它会从设置中消失。
  • @Paulw11 我正在尝试找出文档是否解释说,如果给定应用程序明确不允许位置权限,或者自 2014 年以来这种情况发生了变化,则不会显示权限请求

标签: ios core-location ibeacon


【解决方案1】:

对于 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 翻译。

【讨论】:

【解决方案2】:

遇到了完全相同的问题。 事实证明,在我的情况下,NSLocationAlwaysUsageDescription 在我的InfoPlist.strings 本地化文件中也是必需的。在Info.plist 中有NSLocationAlwaysUsageDescription 还不够……

【讨论】:

  • 我要补充一点,还要检查您是否有Info-Debug.plist 等,因为我已将字符串放在我的主Info.plist 文件中,但忘记将其复制到另一个文件中。所以在模拟器中,一切都默默地失败了,这让我很震惊。
  • 你在哪里找到这样的列表(InfoPlist)?我找不到它
【解决方案3】:

我注意到,如果您的 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];
}

【讨论】:

  • 这也是我的问题。谢谢!
【解决方案4】:

我最近在尝试使用IOS 11时遇到了类似的问题

locationManager.requestAlwaysAuthorization()

我的解决方案是在Info.plist 中添加所有 4 个权限以获取警报:

  • Privacy - Location When In Use Usage Description
  • Privacy - Location Usage Description
  • Privacy - Location Always Usage Description
  • Privacy - Location Always and When In Use Usage Description

【讨论】:

    【解决方案5】:

    只需将此行添加到您的 .plist 文件中

    <key>NSLocationAlwaysUsageDescription</key>
    <string>Optional message</string>
    

    【讨论】:

      【解决方案6】:

      尝试开始更新位置(对我有帮助)

      [self.locationManager startUpdatingLocation];
      

      【讨论】:

        【解决方案7】:

        对于 ios 11 重要的是添加下面提到的新权限

        NSLocationAlwaysAndWhenInUseUsageDescription

        连同旧的权限

        NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription

        修复 requestAlwaysAuthorization 不显示权限警报。

        【讨论】:

          【解决方案8】:

          硬件相关的系统问题?

          iOS 13.1.3,iPhone 7(型号 ID“iPhone9,1”)

          看起来像系统设置->隐私->即使在应用程序删除之后(至少,在同一个 iOS 会话期间和指定配置),位置也以某种方式缓存权限。

          如果按下“允许一次”并且用户删除并重新安装并再次运行应用程序,didChangeAuthorizationStatus(_:) 将发送初始状态 .denied。 (因此,根据 CLLocationManager 逻辑,它不会在 requestAlwaysAuthorization() 之后显示提示警报)。 这种 .denied 状态是本案的祸根。

          如果用户在初始的 didChangeAuthorizationStatus(:) 和 requestAlwaysAuthorization() 之间折叠应用程序,这将导致 didChangeAuthorizationStatus(:) 的下一次更新状态不是 .denied 并且将显示提示警报。

          iOS 13.1.3,iPhone 7(型号 ID“iPhone9,3”) - 问题不会重现。 (收到的初始状态是 .notDetermined)

          iOS 13.1.2 iPhone 8 - 一切正常,同上

          【讨论】:

          • 您找到解决方案了吗?
          • 否,在这种特殊情况下使用了计时器/超时的解决方法。
          • 我们的测试人员正在观察一个类似的问题。 iOS 13.2.2,当他们不断从 iPhone 7 和 8 上的 Test Flight 中删除和重新安装时,他们偶尔会遇到应用程序获得初始权限为 .denied 的情况,但如果你转到“设置”,它会显示“使用中”。在这种情况下永远不会显示位置提示,并且一旦您重新启动应用程序,它就会像在使用中或在之前的安装中选择的任何内容一样获得权限。好像安排了一些后台任务什么的,需要时间来清除权限。
          【解决方案9】:

          在论坛上找到、记录并测试它是一个与 Objective-C iOS 8 相关的错误。 用 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()
          }
          

          对话框出现正常

          【讨论】:

            【解决方案10】:

            确保将密钥添加到正确的 Info.plist 文件中。不要忘记有一个用于您的应用程序和一个用于 AppTest。

            【讨论】:

            • 这是我的问题。谢谢! :P
            【解决方案11】:

            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)")
            
                }
            

            【讨论】:

              【解决方案12】:

              我复制了这个教程...

              http://willd.me/posts/getting-started-with-ibeacon-a-swift-tutorial

              没有解决问题,虽然修复很简单,但不要声明

              让 locationManager = CLLocationManager()

              但是将它作为变量移到类中

              var locationManager = CLLocationManager()

              它有效!

              【讨论】:

                【解决方案13】:

                当您的应用程序的位置权限未设置时,它会显示提示,一旦您的应用程序的“使用中”位置权限设置,后续调用不会显示(我认为没有任何 API呼叫被吞下的反馈)。

                来自Apple docs

                讨论当当前授权状态未确定时, 此方法异步运行并提示用户授予 应用程序使用位置服务的权限。用户提示 包含来自 NSLocationAlwaysUsageDescription 键的文本 您的应用程序的 Info.plist 文件,并且该密钥的存在是必需的 调用此方法时。状态确定后,位置 经理将结果交付给代表的 locationManager(:didChangeAuthorization:) 方法。如果当前 授权状态是 notDetermined 以外的任何东西,这个方法 什么都不做,也不叫 locationManager(:didChangeAuthorization:) 方法,有一个例外。 如果您的应用从未请求始终授权并且其当前 授权状态为 authorizedWhenInUse ,你可以调用这个 方法一次尝试将您的应用的授权状态更改为 授权总是。

                【讨论】:

                  【解决方案14】:

                  请查看Reference link

                  它描述了有关 iOS 11 的所有更改。您的问题似乎也是它描述的案例之一。它可能会让您了解需要对代码进行哪些更改才能纠正问题。

                  【讨论】:

                    【解决方案15】:

                    对于 iOS 13 上的我,我必须重置模拟器才能再次触发权限提示。

                    【讨论】:

                      【解决方案16】:

                      补充一点:确保您已将数组 UIBackgroundModes 添加到您的 .plist 并插入“位置”值。

                      Apple 不会告诉你它丢失了,而是给你WhenInUse。

                      总结一下:

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

                      【讨论】:

                        【解决方案17】:

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

                        【讨论】:

                          猜你喜欢
                          • 2015-01-29
                          • 2015-02-02
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-03-16
                          • 1970-01-01
                          • 2017-02-25
                          • 1970-01-01
                          相关资源
                          最近更新 更多