【问题标题】:Swift 3 / iOS 10 / TodayExtension - UserDefaults always returns nilSwift 3 / iOS 10 / TodayExtension - UserDefaults 总是返回 nil
【发布时间】:2017-02-10 00:33:55
【问题描述】:

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

我正在开发一个带有今天扩展的简单笔记应用程序。我在 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 总是说我没有笔记。 你知道为什么会出现这个问题吗?

感谢您的帮助! :)

【问题讨论】:

    标签: swift nsuserdefaults swift3 ios10 userdefaults


    【解决方案1】:

    我部分解决了我的问题。

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

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

    我仍然有 WatchKit Extension 的问题。我不确定,但我认为我已经阅读了即使应用程序组的 UserDefaults 也不会与 Apple Watch Extensions 共享。

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

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

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

    【讨论】:

      【解决方案2】:

      我有一个我认为类似的问题(我的问题特别是用户在 ios 9.x swift 2.x 下保存的默认值在新的 xcode8/swift3 中没有被检索;默认值为 nil所以我认为数据已经丢失)并且我将其追溯到模拟器。 Xcode8 引入了新的模拟器,它们实际上只是新的“设备”。我将我的 Xcode8 模拟器恢复为 iOS 9.x 版本,并且默认设置如预期的那样。

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

      希望这会有所帮助!

      【讨论】:

      • 非常感谢您的回答。我试过你说的,没有任何效果。我还尝试创建新项目来测试这是否是因为迁移到 Swift 3 并且发生了同样的事情。我“发现”当我们在 UserDefaults 中保存某些内容(即使是组)时,为存储 UserDefaults 而创建的 .plist 是在扩展程序中的另一个文件夹中创建的,而不是在主应用程序中。所以扩展中的 plist 不存在,这就是为什么它总是返回 nil :(
      • 有趣。我会关注这个问题,以便随时了解其他发现。
      • 好的。谢谢你的帮助:)
      猜你喜欢
      • 2018-01-29
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2016-12-07
      • 2019-05-31
      • 1970-01-01
      相关资源
      最近更新 更多