我很困惑,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数据。
我尝试了单视图应用模板而不是游戏模板,认为可能是问题,不。
我该怎么办?
任何帮助,感激不尽。谢谢
答案 0 :(得分:2)
您正在混淆两个相关但不同的类。
CMMotionManager
可以访问加速度计,磁力计和陀螺仪数据。它不需要任何用户许可,因为此信息不被视为与隐私相关。
在您的else
子句中,您正在检查CMMotionActivityManager
的授权状态。该对象报告设备的运动类型(步行,跑步,驾驶)。该信息被认为与隐私有关,当您创建此类的实例并向其请求数据时,将显示权限警报。
触发else
的原因是因为您正在检查isDeviceMotionActive
;这将是false
,直到您调用startDeviceMotionUpdates
为止(从未执行过)。即使您使用了isAccelerometerActive
,也会遇到问题,因为您在startAccelerometerUpdates
子句中调用了if
,这将是永远无法实现的。
您可能打算检查isAccelerometerAvailable
。如果返回false
,则说明您无能为力。该设备没有加速度计。
更新
在调用isDeviceMotionActive
之后立即检查startDeviceMotion
是没有意义的:
false
。 Apple建议每种运动设备类型的观察者不超过一个,因此检查is...Active
以确保不再使用start...
的目的是做到了。
如果仅需要陀螺仪数据,则根本不需要调用startDeviceMotionUpdates
。