2016-10-01 50 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中取回筆記。

至少我已經解決了我的第一個問題。如果有人有相同的。