Swift 3/iOS 10/TodayExtension - UserDefaults всегда возвращает ноль

Это мой первый вопрос на этом сайте. У меня проблема, которую я не могу исправить.

Я работаю над простым приложением для заметок с сегодняшним расширением. У меня не было проблем в Swift 2.2 и iOS 9. Проблема только появляется в Swift 2.3 и Swift 3 на iOS 10. У меня проблема в следующем:

Пользователь может написать заметку (сохраненную в UserDefaults), открыть Центр уведомлений и просмотреть свои заметки в TodayExtension.

У меня есть эти методы для сохранения заметок в UserDefaults и извлечения их из UserDefaults (я использую группы, поэтому в возможностях моего приложения и моего расширения все настроено правильно. Кроме того, мои объекты, конечно, требуют методов NSCoding):

open class NoteManager: NSObject {

    private static let kKEY: String! = "Notes"
    private static let kSUITENAME: String! = "Team.group.bundleIdentifier"

    open static func saveNotes(_ notes: [Note]) {
        let notesData = NSKeyedArchiver.archivedData(withRootObject: notes)

        let defaults = UserDefaults(suiteName: kSUITENAME)!
        defaults.set(notesData, forKey: kKEY)
        defaults.synchronize()
    }

    open static func retrieveNotes() -> [Note] {
        let notesFromDefault = UserDefaults(suiteName: kSUITENAME)!.object(forKey: kKEY)
        var returnedNotes: [Note]! = [Note]()

        if notesFromDefault != nil {
            if let notesData: Data? = notesFromDefault as! Data! {
                NSKeyedUnarchiver.setClass(Note.self, forClassName: "Application_Name.Note")
                NSKeyedUnarchiver.setClass(Preference.self, forClassName: "Application_Name.Preferences")
                let unarchivedNotes = NSKeyedUnarchiver.unarchiveObject(with: notesData!) as? [Note]

                if let notes: [Note] = unarchivedNotes! as [Note]! {
                    returnedNotes = notes
                }
            }
        }

        return returnedNotes
    }
}

В приложении iOS у меня НЕТ проблем. UserDefaults хорошо работает с этим кодом. Но когда я открываю TodayExtension, следующая строка (в retrieveNotes()) всегда возвращает nil :

let notesFromDefault = UserDefaults(suiteName: kSUITENAME)!.object(forKey: kKEY)

Поэтому мой TodayExtension всегда говорит, что у меня нет заметок. Есть ли у вас какие-либо идеи, почему эта проблема возникает?

Спасибо за помощь ! :)


person Darkkrye    schedule 01.10.2016    source источник


Ответы (2)


Я частично решил свою проблему.

Я полностью удалил Xcode и все настройки (файлы кеша и т. д.), а затем удалил часть «Команда» в названии пакета.

Теперь у меня есть предупреждение в консоли Xcode, но я могу получить свои заметки в своем TodayExtension. Пиуф!

У меня все еще есть проблема с расширением WatchKit. Я не уверен, но я думаю, что я читал, что UserDefaults даже с группами приложений не используются совместно с расширениями Apple Watch.

Но Apple пишет в своей документации: «Кроме того, iOS автоматически пересылает доступную только для чтения копию настроек вашего приложения iOS в Apple Watch. Ваше расширение WatchKit может читать эти настройки с помощью объекта NSUserDefaults, но не может вносить изменения непосредственно в базу данных по умолчанию».

Поэтому я не знаю, почему я не могу получить свои заметки с Apple Watch.

По крайней мере, я решил свою первую проблему. Если у кого есть такие же.

person Darkkrye    schedule 15.10.2016

У меня была похожая проблема (в частности, моя проблема заключалась в том, что значения по умолчанию, сохраненные пользователем под ios 9.x swift 2.x, не извлекались в новом xcode8/swift3; значения по умолчанию были нулевыми, поэтому я подумал данные были потеряны), и я проследил это до симулятора. Xcode8 представил новые симуляторы, которые на самом деле являются просто новыми «устройствами». Я вернул свой симулятор Xcode8 обратно к версии iOS 9.x, и значения по умолчанию были такими, как и ожидалось.

Чтобы добавить симулятор, прокрутите список симуляторов iOS до конца, нажмите «Добавить дополнительный симулятор» и следуйте инструкциям, чтобы вернуться к симулятору iOS 9.x.

Надеюсь, это поможет!

person The App Lady    schedule 06.10.2016
comment
Большое спасибо за ваш ответ. Я попробовал то, что вы сказали, и ничего не работает. Я также попытался создать новый проект, чтобы проверить, было ли это связано с переходом на Swift 3, и произошло то же самое. Я обнаружил, что когда мы сохраняем что-то в UserDefaults (даже с группами), .plist, созданный для хранения UserDefaults, создается в другой папке в расширениях, чем основное приложение. Так что plist в расширениях не существует, и поэтому он всегда возвращает nil :( - person Darkkrye; 08.10.2016
comment
Интересный. Я буду следить за этим вопросом, чтобы быть в курсе любых других выводов. - person The App Lady; 08.10.2016
comment
В порядке. Спасибо за помощь :) - person Darkkrye; 09.10.2016