NSUserDefaults 不在 iOS 8 中的应用程序和自定义键盘之间存储值

Posted

技术标签:

【中文标题】NSUserDefaults 不在 iOS 8 中的应用程序和自定义键盘之间存储值【英文标题】:NSUserDefaults not storing values between app and custom keyboard in iOS 8 【发布时间】:2014-07-16 18:47:40 【问题描述】:

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

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 中修复

【问题讨论】:

NSUserDefault with App Group is not working in ios 8 Beta3的可能重复 我有 XCode 6 beta 5,但问题仍然存在。 【参考方案1】:

一些可能的解决方案是:

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

    您尚未为键盘启用网络访问。 This document 在您为键盘禁用网络访问时(默认行为)声明以下内容:

    没有包含应用的共享容器

    这是一个错误。

【讨论】:

感谢您的回答!我已经三重检查了组标识符——这是正确的。据我所知,应用程序组已正确设置(只需遵循功能部分中的步骤,该步骤为具有组标识符的两个目标创建了权利)。在启用网络访问方面非常出色——我将 RequestsOpenAccess 更改为 YES,擦除了模拟器,然后重新安装;但是,问题仍然存在。我希望这是一个错误!即将在 Xcode beta 4 上进行测试...届时将更新。【参考方案2】:

    设置

    RequestsOpenAccess = YES;
    

    设置:

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

    键盘更改:

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

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

【讨论】:

有没有办法从键盘只读访问设置,而不必要求开放访问? 我到现在都找不到访问权限。如果你明白了,请告诉我,非常感谢。 我有类似 @bdev 的问题,但使用 Watch Kit Extension。 AppGroup 在 XCode 6.3 beta 中运行良好,但在 XCode 6.2 中却不行。我像你推荐的那样添加了synchronize,但它没有帮助。【参考方案3】:

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

【讨论】:

是的,它的格式为 group.mycompany.myapp。我将编辑我的帖子以使其更清楚【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

从 Watch OS 2 开始,共享容器功能已被 Apple 移除。它被记录在某个地方,但被埋葬了。我在这个问题上花了十个小时,从其他帖子中得知了坏消息。

以上是关于NSUserDefaults 不在 iOS 8 中的应用程序和自定义键盘之间存储值的主要内容,如果未能解决你的问题,请参考以下文章

NSUserDefaults 在 IOS 8 模拟器上不起作用 [重复]

iOS 8 beta 5 中的今日扩展的 NSUserDefaults 是不是被破坏?

为啥在 iOS 中使用 NSUserDefaults?

你可以在 NSUserDefaults 中保存 Parse 信息吗? (IOS)

NSUserDefaults 在 iOS 7 中无法正常工作

IOS开发中数据持久化的几种方法--NSUserDefaults