2016-10-01 37 views
2

这是我在本网站的第一个问题。 我有一个问题,我无法修复。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说,我没有任何注解。 你有什么想法为什么会出现这个问题吗?

谢谢你的帮助! :)

回答

0

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

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

希望这有助于!

+0

非常感谢您的回答。 我尝试了你所说的,没有任何工作。 我也试着创建一个新项目来测试这是否是因为迁移到Swift 3而发生了同样的事情。 我已经“发现”,当我们在UserDefaults中保存某些内容时(即使有组),为存储UserDefaults而创建的.plist将在扩展中的另一个文件夹中创建,而不是主应用程序。所以扩展中的plist不存在,这就是为什么它始终返回零( – Darkkrye

+0

)有趣的。我会跟随这个问题,所以我可以保留在任何其他调查结果的循环中 –

+0

好的。谢谢你的帮助:) – Darkkrye

0

我部分解决了我的问题。

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

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

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

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

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

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