Swift 3 / iOS 10 / TodayExtension - UserDefaults总是返回nil

时间:2016-10-01 15:25:36

标签: swift nsuserdefaults swift3 ios10 userdefaults

这是我在这个网站上的第一个问题。 我有一个无法解决的问题。

我正在使用今天的扩展程序开发一个简单的笔记应用程序。我在Swift 2.2和iOS 9中没有遇到任何问题。问题只出现在iOS 10上的Swift 2.3和Swift 3中。 我遇到的问题如下:

用户可以写一个便条(保存在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总是说我没有笔记。 你对这个问题发生的原因有什么看法吗?

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:0)

我认为是一个类似的问题(我的问题特别是在新的xcode8 / swift3中没有检索到用户在ios 9.x swift 2.x下保存的默认值;默认值是nil所以我认为数据丢失了)我追溯到模拟器。 Xcode8引入了新的模拟器,这些模拟器实际上只是新的设备"。我将我的Xcode8模拟器恢复为iOS 9.x版本,默认值与预期一致。

要添加模拟器,请滚动到iOS模拟器列表的底部,然后点击“添加其他模拟器”#39;并按照提示返回iOS 9.x模拟器。

希望这有帮助!

答案 1 :(得分:0)

我部分解决了我的问题。

我已完全删除Xcode和所有设置(缓存文件等...), 然后我删除了" Team"参与套件名称。

现在我在Xcode控制台中有一个警告,但我可以在TodayExtension中检索我的笔记。 Piouf!

我仍然遇到WatchKit Extension的问题。我不确定,但我认为我已经读过UserDefaults即使使用App Groups也不会与Apple Watch Extensions共享。

但Apple在他们的文档中写道"此外,iOS会自动将iOS应用程序首选项的只读副本转发给Apple Watch。您的WatchKit扩展可以使用NSUserDefaults对象读取这些首选项,但它不能直接对默认数据库进行更改。"

所以我不知道为什么我无法从Apple Watch中检索笔记。

至少我已经解决了我的第一个问题。如果有人有相同的。