【问题标题】:CLLocationManager.authorizationStatus() always CLAuthorizationStatus.NotDetermined with swift&objC appCLLocationManager.authorizationStatus() 总是 CLAuthorizationStatus.NotDetermined 与 swift&objC 应用程序
【发布时间】:2014-07-24 07:36:39
【问题描述】:

我只能让我的 CLLocationManager 进行授权。 (ios8下的swift) 我什至添加了一个明确的 requestAlwaysAuthorization 调用(在 ios7 下我不需要 objC)

func finishLaunch() {
    //ask for authorization
    let status = CLLocationManager.authorizationStatus()
    if(status == CLAuthorizationStatus.NotDetermined) {
        self.locationManager.requestAlwaysAuthorization();
    }
    else {
        self.startMonitoring()
    }
    ...
}

回调永远不会得到任何东西,但 NotDermine 并且没有向用户显示 UIAlertView。

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if(status == CLAuthorizationStatus.NotDetermined) {
        println("Auth status unkown still!");
    }
    self.startMonitoring()
}

我做错了吗? -- 对我来说感觉像是一个错误,但我想要一些反馈

【问题讨论】:

  • 嘿,你是怎么做到的?我收到这样的错误:使用未声明的类型'CLLocationManager'
  • 导入 CoreLocation 以使用 CL 东西
  • 那么 UIAlertView 的导入是什么?它应该是基础?
  • 它是 UI 所以它在 UIKit 中
  • OS X 的同样问题,这里的所有答案都没有帮助。

标签: swift ios8 cllocationmanager


【解决方案1】:

请记住,NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription 键现在是强制性的,因此您应该将其包含在您的 plist 中。

【讨论】:

  • 感谢您的支持。该错误仍然有效,因为我什至无法通过设置应用程序对其进行授权,但这是我的解决方案
  • 对于那些仍然对是否正确输入这些键感到困惑的人:stackoverflow.com/questions/24082188/… 准确地显示了它
  • 并把它们放在右边plist! (我首先编辑了test-plist 而不是application-plist
【解决方案2】:

您唯一需要做的就是将“NSLocationWhenInUseUsageDescription”键添加到您的应用程序 info.plist,然后创建一个 CLLocationManager requestWhenInUseAuthorization 方法并在 viewDidLoad 中调用它。

【讨论】:

  • 实际上我在代理 didFinishLoading 中运行它,因为我在地图控制器中没有 CLLocationManager,但即使在 info.plist 中输入条目后它也会被忽略,总是返回:“尝试启动 MapKit 位置更新不提示位置授权。必须先调用 -[CLLocationManager requestWhenInUseAuthorization] 或 -[CLLocationManager requestAlwaysAuthorization]。
  • @FabrizioBartolomucci,当您调用 requestWhenInUseAuthorization/requestAlwaysAuthorization 时,CLLocationManager 对象是在本地分配的吗?如果是这样,它将在您退出 didFinishLoading 时释放,并且当用户点击“允许”时,将没有位置管理器来保存结果。您需要一个全局/强引用位置管理器(我将其作为我的应用程序委托的属性)。
  • @Tiago 谢谢,但 smb 已经帮助了我 - 我错过了代码
  • 有趣的是:在 iOS 8 之前,该代码运行良好多年。事实上,我记得运行管理器的工作方式与创建 NSUrlConnection 非常相似,保留它会自动发生。也许这在 iOS 8 中发生了变化。很高兴知道,谢谢,我会尽快对其进行测试。
  • 而且它一直不工作。 Apple 团队表示它可能不会回答有关预发布软件的问题,但他确认 iOS 8 中存在本地化问题。您知道这里可以提交预发布错误吗?
【解决方案3】:

我的 objC 应用程序也发生了这种情况——我知道的那个在 ios7 下可以正常工作——我认为这应该是一个操作系统错误并报告了它:#17128352

【讨论】:

  • iOS 8 中的didUpdateToLocations 有更新吗?我没有收到委托中的任何位置。
  • 如果我转到设置>隐私>位置服务并在应用程序运行时对其进行授权 - 然后我会这样做!直到我重新启动应用程序
  • 好吧,这成功了:if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [self.locationManager requestAlwaysAuthorization]; }
  • 请记住,NSLocationAlwaysUsageDescription 密钥现在是强制性的,因此您应该将其包含在您的 plist 中。编辑:是强制性的,具体取决于您的位置授权方法。对于正在使用的身份验证,请使用 NSLocationWhenInUsageDescription
  • @amb:哈就是这样!请将其发布为答案
【解决方案4】:

我有一个有趣的案例,其中有一个需要位置的键盘插件

键盘位置使用权限始终被重置。 您可以分别在两者中请求位置权限。但在 iOS 设置应用程序 中,它们都显示为一条记录,一般允许两条记录。

应用程序嵌入式键盘)都有Info.plist文件。 在两个Info.plist 文件中指定NSLocationAlwaysUsageDescription / NSLocationWhenInUseUsageDescription 很重要。 如果你在应用程序Info.plist中错过了NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription,那么当你打开应用程序时,iOS会重置为键盘获得的权限!!!

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2014-11-28
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多