Расширение Swift iOS Intent: данные не могут быть прочитаны, поскольку они имеют неправильный формат

Я пытался добавить расширение 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)")
    }
}

person dippnerd    schedule 01.03.2019    source источник


Ответы (1)


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

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

person JIE WANG    schedule 01.03.2019
comment
Попался, я мог видеть это. Я использовал NSKeyedArchiver, поэтому я просто надеялся не переписывать его, но JSON, по крайней мере, не так уж и плох :) Спасибо! - person dippnerd; 01.03.2019