我想使用 CMSensorRecorder 来持续收集Accelerometer数据,如果用户没有在watch \ phone上打开我的应用程序。
我想做的是 - "只要有可能" (即手表醒着,我可以执行代码),执行以下操作:
我的问题是 - 如何实现"尽可能",即如何在手表本身唤醒时让我的手表应用程序唤醒并执行这些apis?
答案 0 :(得分:0)
似乎你无能为力。我尝试过以下方法,但这些都不起作用。
注册backgroundApplicationRefresh(watchOS 3)并确保将应用程序保存到Dock。 Dock应用程序可以依靠每小时拨打一个电话来自行更新。
完成加速度计数据的周期查询并将结果存档到文件,然后将文件传输到iOS随播应用。假设您有足够的CPU时间将加速度计数据写入文件,文件传输将在独立于监视工具包应用程序的后台进行。
尝试使用ProcessInfo API来保持流程正常运行。
到目前为止,我唯一的成功就是运行一个异步线程来提取数据并通过每次屏幕空白时点击屏幕来保持监视工具包应用程序处于活动状态。
希望这会有所帮助,请发布您找到的更好的解决方案。
答案 1 :(得分:0)
CMSensorRecorder-连续使用ExtentionDelegate对CMSensorRecorder进行记录,以调用开始记录和读取数据。
func applicationDidBecomeActive() {
print("Active")
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
AccelorometerDataReader.sharedReader.sessionEndDate = Date()
AccelorometerDataReader.sharedReader.getRecordedData()
}
func applicationWillResignActive() {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, etc.
print("inactive")
AccelorometerDataReader.sharedReader.startReadingAccelorometerData()
AccelorometerDataReader.sharedReader.sessionStartDate = Date()
}
// AccelorometerReaderCode
func startReadingAccelorometerData()
{
if CMSensorRecorder.isAccelerometerRecordingAvailable()
{
if CMSensorRecorder.isAuthorizedForRecording()
{
print("Authorized.......")
DispatchQueue.global(qos: .background).async
{
self.recorder?.recordAccelerometer(forDuration: 3 * 60) // Record for 3 minutes
}
}
else
{
print("not authorized")
}
}
else
{
print("NOt available for recording")
}
}
func getRecordedData()
{
DispatchQueue.global(qos: .background).async
{
if self.sessionStartDate < self.sessionEndDate
{
if let list = self.recorder?.accelerometerData(from: self.sessionStartDate, to:self.sessionEndDate)
{
for record in list
{
let data = record as! CMRecordedAccelerometerData
print("x: \(data.acceleration.x) y: \(data.acceleration.y) z: \(data.acceleration.z) time :\(data.startDate.getFormattedDate())")
}
}
}
}
}
}