Быстрое расширение намерений iOS: данные не могут быть прочитаны, потому что они не в правильном формате - PullRequest
0 голосов
/ 01 марта 2019

Я пытался добавить iOS Siri Intent Extension в свое приложение.Существует общий класс между основным приложением и расширением, и внутри этого класса он создает массив объектов, а затем использует UserDefaults для сохранения / загрузки их по мере необходимости.Это прекрасно работает в основном приложении, но при запуске расширения выдает следующую ошибку:

«Данные не могут быть прочитаны, поскольку они имеют неправильный формат.»

У меня есть группы приложений, включенные между ними, и все файлы распределяются по мере необходимости.Все, что я читал здесь и в других местах, говорит о том, что все должно быть так просто, но я не могу понять, почему данные будут в неправильном формате, когда они используют один и тот же класс для загрузки / сохранения в обоих местах.Используя точки останова, я вижу, что объект данных имеет одинаковый размер в обоих приложениях, но если я просматриваю его содержимое, оно выглядит по-разному.Я также попытался сохранить данные на диск с помощью containerURL (forSecurityApplicationGroupIdentifier: "group.xxxx"), но столкнулся с теми же проблемами.

Любая помощь приветствуется!

var arrayOfObjects = [MyObject]()

func save() {
    do {
        guard let defaults: UserDefaults = UserDefaults(suiteName: "group.xxxx") else {
            fatalError("Error loading user defaults")
        }

        let data = try NSKeyedArchiver.archivedData(withRootObject: arrayOfObjects, requiringSecureCoding: false)

        defaults.set(data, forKey: "objects")
        defaults.synchronize()
    } catch {
        print("Error: \(error.localizedDescription)")
    }
}

func load() {
    do {
        guard let defaults: UserDefaults = UserDefaults(suiteName: "group.xxxx") else {
            fatalError("Error loading user defaults")
        }

        if let data = defaults.data(forKey: "objects") {

            guard let objectData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [MyObject] else {
                fatalError("Error reading data from archive")
            }
            arrayOfObjects = objectData
        }

    } catch {
        print("Error: \(error.localizedDescription)")
    }
}

1 Ответ

0 голосов
/ 01 марта 2019

Я думаю, что вы не можете unarchiveTopLevelObjectWithData, потому что они находятся в другом приложении.

вам следует использовать строку формата JSON для обмена данными между вашим приложением и расширением.

...