【问题标题】:Save and Load Data on Today Extensions (iOS 8)在 Today Extensions (iOS 8) 上保存和加载数据
【发布时间】:2014-07-26 17:08:10
【问题描述】:

是否可以使用 NSUserDefaults 在 Today Extension 上保存和加载数据? 关闭通知中心后,小部件的行为就像一个终止的应用程序,因此任何数据结果都会丢失。我该如何解决这个问题?

这是我的代码:

NSUserDefaults *defaults;

- (void)viewDidLoad {

[super viewDidLoad];

defaults = [NSUserDefaults standardUserDefaults];
NSArray *loadStrings = [defaults stringArrayForKey:@"savedStrings"];

if ([loadStrings objectAtIndex:0] != nil) {
    [display setText:[NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:0]]];
}
if ([loadStrings objectAtIndex:1] != nil) {
    calculatorMemory = [NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:1]].doubleValue;
}

}


- (IBAction)saveData:(id)sender {

NSString *displayString;
NSString *memoryString;

NSArray *saveStrings = [[NSArray alloc] initWithObjects: displayString, memoryString, nil];


defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:saveStrings forKey:@"savedStrings"];
[defaults synchronize];


}

【问题讨论】:

标签: ios widget nsuserdefaults ios8 ios-app-extension


【解决方案1】:

您需要使用应用组标识符而不是 com.* 例如:

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.appgroup"];

存储数据时不要忘记同步

[shared synchronize];

【讨论】:

  • 谢谢,但是在阅读了更深入的文档后,两天前我解决了你写的问题!
  • @MassimoPiazza 我已按照步骤操作,但这不起作用。我正在使用键盘应用程序扩展。想法?
  • @Spentak 您是否在 xcode 项目功能中启用了 App 组以包含应用程序和键盘扩展?
  • @BenjG37 是的,我做到了。用户默认设置是否可能不适用于键盘扩展?
  • 关于这个主题的精彩教程glimsoft.com/06/28/ios-8-today-extension-tutorial
【解决方案2】:

您需要添加详细的应用程序组内容under here,然后如果它确实有效(在测试版下相当不确定),它应该允许您在主机和小部件之间像往常一样共享 NSUserDefault 数据。

编辑:普通 NSUserDefaults 不起作用。苹果实施了一种新方法。要使用,只需像这样重新定义您的 NSUserDefaults 实例:

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"com.you.app.container"];

【讨论】:

  • @BalestraPatrick 确保正确配置了应用组,并为您的应用目标和扩展目标以及您的应用 ID 和配置文件配置了正确的权利。
  • 这似乎不适用于 iOS 键盘扩展
【解决方案3】:

如果有人想知道您到底是如何保存和获取值的,请查看此代码。

在您的常规应用程序中添加它以将您喜欢的任何内容保存在 *.m 文件中。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"];

    //save dic
    [shared setObject:dictionary2 forKey:@"dicForTodayWidget"];

    //save array
    [shared setObject:tempArray2 forKey:@"arrayForTodayWidget"];

    //save some value
    [shared setObject:@"1234" forKey:@"myValForTodayWidget"];

    [shared synchronize];

在 viewDidLoad 中 TodayViewController.m 下的今天小部件中添加此内容。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"];

    //get dic
    NSMutableDictionary *dictionary = [shared objectForKey:@"dicForTodayWidget"];

【讨论】:

    【解决方案4】:

    您首先需要为两个目标(应用程序扩展程序)设置应用程序组。

    然后,使用

    NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.myapp"];
    

    获取可以像往常一样读取/写入的默认对象。

    如果您想在默认值更改时收到通知,请在您的小部件(或应用)中使用 NSUserDefaultsDidChangeNotification

    有关解释所有这些的分步教程,请查看blog post

    【讨论】:

    • 跟随教程,不适用于键盘应用扩展
    • @Spentak 这很奇怪。究竟是什么不工作?此外,本教程(以及这个 SO 问题)是关于 Today 扩展的,键盘的限制要多得多 - 也许他们对 NSUserDefaults 或其他东西有一些限制。
    • Lukas - 你可以让用户默认在键盘扩展上工作吗?我已经测试过了,做不出成功的测试用例。
    • 您尝试过使用NSUserDefaultsDidChangeNotifications 吗?我没有收到通知,其他人似乎也没有,但我找不到任何官方文档,所以我仍然想知道这是否可能。
    • hagi - 你找到了如何让NSUserDefaultsDidChangeNotification 工作的解决方案吗?对我来说,它也不起作用。我可以检查值是否从主应用程序更改为扩展程序,并使用每秒触发的计时器进行检查。但即使值已更改,通知也不会出现。我使用组,我使用initWithSuiteName 进行用户默认启动。我可以达到价值观。因此,除了通知外,一切正常。我通过addObserver:selector:name:object: 将通知中心观察者添加到我的扩展中,对象值为nil。但它不起作用。
    【解决方案5】:

    @edukulele Today Extension 和 Main 应用程序在两个进程上运行。 Today Extension 无法接收 NSUserDefaultsDidChangeNotifications。我尝试使用MMWormhole。非常好。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 我的答案包括这个库。如何使用库必须访问这个链接。我觉得很简单。现在我已经删除了那个链接。
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多