iOS 11.4不询问隐私使用情况(已设置“隐私-动作使用说明”)

时间:2018-07-22 20:27:17

标签: ios swift xcode

我很困惑,iOS 11.4(15F79),iPhone6。无法获取该应用程序以请求运动数据。已通过编辑器设置了info.plist,并通过在textWrangler中打开的info.plist进行了再次检查,同时还删除了密钥并通过textWrangler保存。

 <key>NSMotionUsageDescription</key>
 <string>This app needs your Phones motion manager to update when the phone is tilted. Please allow this App to use your phones tilt devices</string>

我已删除,然后重新安装了该应用程序约10次。我已经给电话加注了5次。我已经检查了设置,但我的应用程序未显示在Privacy-Motion和Fitness中或设置的其他任何位置。我使用的是免费的开发者帐户,也许与此有关?

我创建了一个新的Xcode游戏模板,除了导入CoreMotion和此代码外,没有做任何更改

****编辑,抱歉,我忘了说我已经启动了实例,只是忘了把它放在这里,以防万一有人认为这是问题**************

let motionManager = CMMotionManager()

override func didMove(to view: SKView) {

 motionManager.startDeviceMotionUpdates()

    if motionManager.isDeviceMotionActive == true {
        motionManager.accelerometerUpdateInterval = 0.2
        motionManager.startAccelerometerUpdates(to:  OperationQueue.current!, withHandler: {
        (accelerometerData: CMAccelerometerData!, error: NSError!) in
            let acceleration = accelerometerData.acceleration
            print(accelerometerData)
        } as! CMAccelerometerHandler)
    }else{
        print(CMMotionActivityManager.authorizationStatus().rawValue)
    }

会在控制台上输出0(一个Enum-大小写未确定)。

在我的实际应用中,它是3(相同的Enum-case case Denied)。

正如我所说的,我已经通过Xcode和text wrangler(代码编辑器)卸载,重新安装,编辑了plist,尝试了上述代码的不同版本,并在不同的地方尝试了代码(确实可以查看, class)尝试删除苹果文档中的代码。等等。。。还没有人问我NSUsage问题,该应用程序一直崩溃。

我一直在寻找触发警报的方法,就像在CLLocationManager.requestWhenInUseAuthorization()中一样,但是我找不到类似的CMMotion版本(我认为没有。)我创建了一个新的swift文件,导入Foundation和CMMotion,只是将代码放在此处,但仍然没有Alert要求提供Motion数据。

我尝试了单视图应用模板而不是游戏模板,认为可能是问题,不。

我该怎么办?

任何帮助,感激不尽。谢谢

1 个答案:

答案 0 :(得分:2)

您正在混淆两个相关但不同的类。

CMMotionManager可以访问加速度计,磁力计和陀螺仪数据。它不需要任何用户许可,因为此信息不被视为与隐私相关。

在您的else子句中,您正在检查CMMotionActivityManager的授权状态。该对象报告设备的运动类型(步行,跑步,驾驶)。该信息被认为与隐私有关,当您创建此类的实例并向其请求数据时,将显示权限警报。

触发else的原因是因为您正在检查isDeviceMotionActive;这将是false,直到您调用startDeviceMotionUpdates为止(从未执行过)。即使您使用了isAccelerometerActive,也会遇到问题,因为您在startAccelerometerUpdates子句中调用了if,这将是永远无法实现的。

您可能打算检查isAccelerometerAvailable。如果返回false,则说明您无能为力。该设备没有加速度计。

更新

在调用isDeviceMotionActive之后立即检查startDeviceMotion是没有意义的:

  1. 您知道它处于活动状态;您刚刚开始
  2. 我想象启动会花费一些时间,因此如果您立即检查,可能会得到false

Apple建议每种运动设备类型的观察者不超过一个,因此检查is...Active以确保不再使用start...的目的是做到了。

如果仅需要陀螺仪数据,则根本不需要调用startDeviceMotionUpdates