7

我正在尝试在我的应用程序和自定义键盘扩展之间共享数据。我已经在主应用程序目标和自定义键盘目标中打开了应用程序组。在我的主应用程序中,我添加了一个具有以下内容的对象:

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.myapp"];
[userDefaults setObject:someObject forKey:@"KEY"];

在控制台中打印出 [userDefaults dictionaryRepresentation] 表明该对象已被保存,调用 [userDefaults objectForKey:@"KEY"] 也是如此。

但是,当我尝试在自定义键盘扩展中访问此对象时:

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.myapp"];
NSString *value = [userDefaults objectForKey:@"KEY"];

该值为 nil 并且对 [userDefaults dictionaryRepresentation] 的调用不会显示上面保存的条目。我在 Xcode 6 beta 3 上。有什么想法吗?

更新 已在 Xcode 6 beta 5 中修复

4

5 回答 5

7

一些可能的解决方案是:

  1. 您的应用组设置不正确,或者您没有使用正确的组标识符initWithSuiteName:

  2. 您尚未为键盘启用网络访问。当您为键盘禁用网络访问时,本文档说明了以下内容(默认行为):

    没有包含应用程序的共享容器

  3. 这是一个错误。

于 2014-07-19T23:28:19.573 回答
4
  1. RequestsOpenAccess = YES;
    
  2. 设置:

    NSUserDefaults * usrInfo = [[NSUserDefaults alloc] initWithSuiteName:@"myKeyboard"];
    [usrInfo setObject:theme.icon forKey:@"themeName"];  // This is the new data;
    [usrInfo synchronize]; 
    
  3. 键盘更改:

    NSUserDefaults * usrInfo = [[NSUserDefaults alloc] initWithSuiteName:@"myKeyboard"];
    [usrInfo synchronize];
    NSString * str = [usrInfo objectForKey:@"themeName"];
    

然后你可以改变键盘,例如,改变它的背景

于 2014-09-11T09:54:54.443 回答
2

我认为您的套件名称必须以 group 开头并与您制作的容器相匹配(source)。

于 2014-07-16T18:59:17.257 回答
1

我发现它必须遵循以下格式:group.com.company.appname - 我有其他东西但它不起作用。

于 2018-03-19T16:24:24.303 回答
0

您的组名(在 Xcode 中设置)必须以“组”开头(例如“ group.com.myName.MyApp ”(我在创建组功能时了解到这一点,因为名称字段已经填充了“组”。)并且 NSUserDefaults suiteName 必须以另一个“组”开头,因此“组”存在两次,例如“ group.group.com.myName.MyApp ”)。我通过查看应用程序的 Library/Preferences 目录了解了这一点在 sim 中运行。除非我使用此方案,否则不会出现任何内容。

我仍然无法让手表应用程序查看通用组默认文件。

于 2015-09-17T10:03:02.347 回答