我正在创建一个应用程序,它将在Apple Watch上记录用户加速一段时间,并将该数据发送到配对的iPhone。我正在使用CoreMotion
框架来实现这一目标。
我的问题:我一直在使用CMSensorRecorder
对象来记录数据。这工作了一段时间,但CMSensorRecorder.authorizationStatus()
现在“未经授权”。
我从一开始就在手表和手机应用程序的NSMotionUsageDescription
文件中有一个info.plist
。我删除并重新添加了这些,没有运气。
我记得该应用程序显示允许运动跟踪的提示,但无法重新显示提示的能力。非常感谢有关如何再次启用CMSensorRecorder
的任何建议。干杯。
我的代码初始化CMSensorRecorder
:
if CMSensorRecorder.isAccelerometerRecordingAvailable(){
if CMSensorRecorder.authorizationStatus() == .authorized {
print("\(Date()): recorder started")
DispatchQueue.global(qos: .background).async {
DispatchQueue.global(qos: .background).sync{
self.dateStart = Date()
self.recorder.recordAccelerometer(forDuration: self.duration)
}
}
}
else {
print("\(CMSensorRecorder.authorizationStatus())")
self.xAccLabel.setText("not authorised")
}
}
else {
print ("Recording not available")
self.xAccLabel.setText("Not available")
}
找到THIS线程,并有一个答案,说:
我发现
CMSensorRecorder.isAuthorizedForRecording()
只有在你的应用程序被授权在true
和Privacy/Motion
(在iPhone上)后才会返回Fitness
。然后,为了使应用程序授权Motion
和Fitenss
我必须访问其中一个核心运动功能(如startActivityUpdatesToQueue
甚至recordAccelerometerForDuration
)。在那之后你只需要在iPhone上确认,从现在起CMSensorRecorder.isAuthorizedForRecording()
返回true
。不过,我无法从
CMSensorRecroding
获得任何数据。在我的情况下,accelerometerDataFromDate
函数不返回任何数据 - 返回的值始终为nil。因为在其他地方说它可能需要3分钟才能使数据可用,我正在做以下情况:
- 我正在与
recordAccelerometerForDuration(30)
开始重新编码会话。在这里我记录当前日期:recordingStartDate = NSDate()
。- 我等待
3min30s
(让手表上的应用程序保持活动状态),在此之后我打电话给:accelerometerDataFromDate(NSDate(timeInterval: 10, sinceDate: recordingStartDate), toDate: NSDate(timeInterval: 20, sinceDate: recordingStartDate)
如您所见,我在请求的30秒录制帧内制作了一个10秒的窗口。- 我得到
nil
。我还尝试了更短的超时,立即访问数据,甚至在调用ecordAccelerometerForDuration之前激活加速度计。什么都没有帮助,我仍然从
accelerometerDataFromDate
回来。我真的很想知道你们怎么能从传感器记录器中获得任何读数......
也许9月9日之后情况会好转。
所以对于authorization
我尝试了如下所示的startActivityUpdates
self.activityManager.startActivityUpdates(to: OperationQueue.main, withHandler: {(data: CMMotionActivity!) -> Void in
})
你需要申报let activityManager = CMMotionActivityManager()
一旦用户允许它if CMSensorRecorder.authorizationStatus() == .authorized {
将是true
。