2014-11-23 49 views
0

我已經爲我的應用設置了應用組,以便我可以在應用和鍵盤擴展中訪問相同的NSUserDefaults。我有一個問題,但。我可以成功地將布爾值寫入默認值,但是當我在鍵盤上訪問它時,它總是返回false。我知道一個事實,它使用的密鑰ID和套件名稱完全相同。我確認應用程序組和應用程序鍵盤都已啓用,並且套件名稱與應用程序組標識符完全匹配。當從鍵盤訪問時,什麼可能導致它始終爲false在共享NSUserDefaults中存儲布爾總是返回假

在應用程序中:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"]; 
[SharedDefaults setBool:YES forKey:@"com.myname.appname.dataName"]; 
[SharedDefaults synchronize]; 

我沒有證實它並順利拿到設置爲YES,下一次我啓動的應用程序:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"]; 
BOOL dataIsYes = [SharedDefaults boolForKey:@"com.myname.appname.dataName"]; //YES 

然而,在鍵盤它始終是假的:

let sharedprefs = NSUserDefaults(suiteName: "group.com.myname.sharedPrefsName")! 
let data = sharedprefs.boolForKey("com.myname.appname.dataName") //false 

回答

1

我發現在App Extension Programming guide答案。

默認情況下,鍵盤沒有網絡訪問權限,不能共享包含其應用程序的容器。要啓用這些功能,請將Info.plist文件中的RequestsOpenAccess布爾鍵值設置爲YES。

要解決此問題,我必須將鍵盤的Info.plist> NSExtension> NSExtensionAttributes> RequestOpenAccess中的RequestsOpenAccess字段更改爲YES。然後在設置中刪除鍵盤,刪除應用程序,再次運行,然後再次添加鍵盤。然後一定要點擊鍵盤名稱,然後將開關撥到「允許完全訪問」。

如果用戶未啓用完全訪問權限,則出於安全和隱私的原因,該擴展仍將能夠訪問共享容器(僅適用於iOS 8.3+),但無法寫入共享容器。在8.2中,如果沒有授予開放權限,您無法讀取它。

-1

不要對NSUserDefaults使用alloc/init。這是一個單身人士。你應該使用類方法 standardUserDefaults得到一個指針共享用戶默認對象:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
+0

從應用程序與鍵盤訪問時,標準用戶默認值不同 - 這是兩個不同的容器,因此您需要使用相同的套件名稱初始化默認值。 – Joey 2014-11-23 23:11:34