WatchConnectivity - невозможно отправить файл, созданный с помощью NSKeyedArchiver. - PullRequest
0 голосов
/ 19 марта 2019

Я создавал приложение, чтобы фиксировать ускорение пользователей на Apple Watch в течение определенного периода времени, а затем отправлять это ускорение на iPhone, где его можно будет обрабатывать дальше.

Общий поток моего приложенияis

  1. Пользователь запускается на Watch.CMSensorRecorder используется для создания CMSensorDataList объекта.
  2. В конце периода записи объект CMSensorDataList сохраняется в часах с помощью NSKeyedArchiver.Для него создан URL.
  3. Я передаю URL на transferFile, используя сеанс WatchConnectivity для отправки файла на 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)
    }
}
...