Swift 3 / iOS 10 / TodayExtension - UserDefaults 总是 returns 无

Swift 3 / iOS 10 / TodayExtension - UserDefaults always returns nil

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

我正在开发一个带有 today 扩展的简单笔记应用程序。我在 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() 中)总是 returns nil :

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

所以我的 TodayExtension 总是说我没有笔记。 您知道为什么会出现此问题吗?

感谢您的帮助! :)

我有一个我认为是类似的问题(我的问题具体是用户在 ios 9.x swift 2.x 下保存的默认值是没有在新的 xcode8/swift3 中检索到;默认值是零,所以我认为数据已经丢失),我将其追溯到模拟器。 Xcode8 引入了全新的模拟器 "devices"。我将我的 Xcode8 模拟器恢复到 iOS 9.x 版本,默认设置如预期。

要添加模拟器,请滚动到 iOS 模拟器列表的底部,然后单击 'Add Additional Simulator' 并按照提示返回到 iOS 9.x 模拟器.

希望这对您有所帮助!

我部分解决了我的问题。

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

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

我仍然有 WatchKit 扩展的问题。我不确定,但我想我已经读过即使有应用程序组的 UserDefaults 也不会与 Apple Watch Extensions 共享。

但是 Apple 在他们的文档中写道 "Also, iOS automatically forwards a read-only copy of your iOS app’s preferences to Apple Watch. Your WatchKit extension can read those preferences using an NSUserDefaults object, but it cannot make changes directly to the defaults database."

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

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