WatchConnectivity-无法发送使用NSKeyedArchiver创建的文件

时间:2019-03-19 04:10:57

标签: swift apple-watch foundation watchconnectivity

一段时间以来,我一直在开发一款应用程序来捕获用户在Apple Watch上的加速度,然后将该加速度发送到iPhone上,以便进一步处理。

我的应用的总体流程是

  1. 用户开始观看。 CMSensorRecorder用于创建CMSensorDataList对象。
  2. 在记录周期结束时,CMSensorDataList对象将使用NSKeyedArchiver保存到手表。为此创建了一个URL。
  3. 我通过WatchConnectivity会话将URL传递到transferFile,以将文件发送到iPhone。
  4. 在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)
    }
}

0 个答案:

没有答案