一段时间以来,我一直在开发一款应用程序来捕获用户在Apple Watch上的加速度,然后将该加速度发送到iPhone上,以便进一步处理。
我的应用的总体流程是
CMSensorRecorder
用于创建CMSensorDataList
对象。 CMSensorDataList
对象将使用NSKeyedArchiver
保存到手表。为此创建了一个URL。transferFile
,以将文件发送到iPhone。我遇到问题的地方是让transferFile
根据URL实际获取所需的文件。尝试发送数据时,我收到消息WatchConnectivity session cannot access the file.
。
我在下面附上了我的相关代码。我将CMSensorDataList
包装在一个自定义类中,以使其符合NSCoding
协议,并利用NSKeyedArchiver
进行保存。
我环顾四周,找不到这种特殊情况。将不胜感激任何反馈或建议。干杯!
课程:
class accelerationData: CMSensorDataList, NSCoding{
struct Keys{
static let name = "name"
}
var data:CMSensorDataList?
override init(){}
//initialize our data
init(myData:CMSensorDataList){
self.data = myData
}
//required functions to comply to NSCoding protocol.
func encode(with aCoder: NSCoder) {
aCoder.encode(data, forKey: Keys.name)
}
required init?(coder aDecoder: NSCoder) {
if let dataObject = aDecoder.decodeObject(forKey: Keys.name) as? CMSensorDataList{
data = dataObject
}
}
}
创建URL:
var filePath:URL{
let fileManager = FileManager.default
let fileName = UUID().uuidString
let path = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first
let fullPath = path!.appendingPathComponent(fileName)
return fullPath
}
保存并发送数据:
private func saveData(_ data:accelerationData){
do{
let archiveObject = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: false)
try archiveObject.write(to: filePath)
}
catch{
print("error")
}
}
func sendData(){
DispatchQueue.main.async {
WCSession.default.transferFile(self.filePath, metadata: nil)
}
}