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