使用 CMSensorRecorder 持续收集 Apple Watch 中的加速度计数据

Posted

技术标签:

【中文标题】使用 CMSensorRecorder 持续收集 Apple Watch 中的加速度计数据【英文标题】:Use CMSensorRecorder to continuously collect Accelerometer data in Apple Watch 【发布时间】:2016-06-02 07:54:05 【问题描述】:

我想使用 CMSensorRecorder持续收集加速度计数据,即使用户没有在手表\手机上打开我的应用。

我想要做的是——“只要有可能”(即手表是醒着的,我可以执行代码),请执行以下操作:

调用 recordAccelerometerForDuration 告诉手表尽可能长时间地继续收集数据 调用 accelerometerDataFromDate 以获取到目前为止收集的数据(或从我上次获取数据开始)

我的问题是 - 如何实现“尽可能”,即我怎样才能让我的手表应用程序在手表本身醒来时唤醒并执行这些 api?

【问题讨论】:

【参考方案1】:

看来你不能。我尝试了以下方法,但这些方法都不起作用。

注册 backgroundApplicationRefresh (watchOS 3) 并确保应用已保存到 Dock。 Dock 应用程序可以依靠每小时接到一个电话来更新自己。

完成对加速度计数据的周期查询并将结果存档到文件,然后将文件传输到 ios 配套应用程序。假设您有足够的 CPU 时间将加速度计数据写入文件,文件传输将在后台发生,独立于手表套件应用程序。

尝试使用 ProcessInfo API 来保持进程运行。

迄今为止,我唯一的成功是运行异步线程来提取数据,并通过在每次屏幕空白时点击屏幕来保持手表套件应用程序处于活动状态。

希望这会有所帮助,请发布您找到的任何更好的解决方案。

【讨论】:

感谢您的信息,很遗憾我没有找到更好的解决方案。【参考方案2】:

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())")
                        
                    
                
        
    

【讨论】:

以上是关于使用 CMSensorRecorder 持续收集 Apple Watch 中的加速度计数据的主要内容,如果未能解决你的问题,请参考以下文章

在Game中使用Obsidian和Zetero持续收集提炼高价值信息

WebApi学习资料收集(持续补充)

git命令收集(记得持续更新)

SQL 脚本持续收集...

信息搜集方法小结(持续更新)

信息搜集方法小结(持续更新)