2017-08-10 194 views
0

之間創建一個小部件今天,我用UserDefaults(suiteName:)堅持一些數據。在主應用程序中,我使用的是UserDefaults.standard()。這不能被讀取(或可以嗎?)的擴展,這就是爲什麼我使用suiteName:構造函數。共享UserDefaults擴展

數據用戶堅持到UserDefaults.standard()在主應用程序需要在擴展可用。

在這個時候,我堅持到兩個,這樣的值可以共享

UserDefaults.standard().set:...forKey:... 
UserDefaults(suiteName:...)().set:...forKey:... 
... 

的問題是我應該放棄UserDefaults.standard()一起,只需使用UserDefaults(suiteName:)在我的應用程序,或者這是不好的做法,如果是爲什麼?

編輯:我使用的應用程序組容器。澄清我問我應該只是用suiteName替換standard():在我的項目中?

+1

,最好的方法是創建_App組_並僅使用共享的'UserDefault'(通過'-suiteName:')或默認的'FileManager'(通過'-forSecurityApplicationGroupIdentifier:') - 您可能不需要標準的用戶默認設置或文件管理器長(但是如果你需要確保你想從擴展中分離數據,你仍然可以使用這些沙箱)。 – holex

+0

感謝這幫忙 – RyanTCB

回答

4

您不能使用共享UserDefaults來共享A pp Extension及其Host App之間的數據。您必須使用App Group,即共享容器UserDefaults(suiteName:)來共享數據。

即使一個應用程序擴展束嵌套包含其 應用程序的包中,正在運行的應用的擴展和含有應用程序內具有彼此的容器沒有 直接訪問。

要啓用數據共享,使用的Xcode或開發人員門戶以使 應用團爲含有應用程序和其包含的應用程序擴展。 接下來,在門戶中註冊應用程序組,並指定要在包含應用程序中使用的應用程序組 。

啓用應用組後,應用擴展程序及其包含的應用程序 都可以使用NSUserDefaults API來共享對用戶 首選項的訪問。爲了使這種共享,使用initWithSuiteName:方法 實例化新的對象NSUserDefaults的,傳入標識符共享組的 。

有關詳細信息,請參閱:https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

如何使用App組:https://github.com/pgpt10/Today-Widget

標準或SuitName?

使用標準的一個數據是僅適用於主機應用程序。使用suiteName作爲您想要在Extension和Host App之間共享的數據。只是不要堅持在他們兩個相同的數據。避免數據冗餘。根據上下文使用它們。

+0

道歉我假設我正在使用'initSuiteName:'它已經給我印象我正在使用一個應用程序組。我是誰。更新了OQ以澄清這一點。謝謝 – RyanTCB

+0

那麼你面臨的問題是什麼? – PGDev

+0

我目前堅持同樣的數據標準和suiteName構造函數。我應該放棄標準()並使用suiteName。 – RyanTCB

1

一個簡單的例子:

if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") { 
userDefaults.set("test 1" as AnyObject, forKey: "key1") 
userDefaults.set("test 2" as AnyObject, forKey: "key2") 
userDefaults.synchronize() 

,你可以稍後紅吧:

if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") { 
let value1 = userDefaults.string(forKey: "key1") 
let value2 = userDefaults.string(forKey: "key2") 
... 

}

如果你想擴展和應用程序之間共享資源