在应用扩展和容器应用之间共享数据

Posted

技术标签:

【中文标题】在应用扩展和容器应用之间共享数据【英文标题】:Sharing data between app extension and conainer app 【发布时间】:2014-08-07 13:38:08 【问题描述】:

我正在尝试在应用扩展程序和我的容器应用程序之间共享数据。 我在容器应用中设置了一个应用组,并在我的应用扩展中引用了它。

当我的应用扩展被访问时,我将一个对象保存到 NSUserDefaults

//in the app extension
-(void)viewDidLoad 
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mygroup.com"];
[defaults setObject:[NSDate date] forKey:@"Date"];
[defaults synchronize];

在容器应用程序中 - 当它启动时,我设置了一个观察者:

// in the container app
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDefaultChanged:) name:NSUserDefaultsDidChangeNotification object:nil];

-(void)userDefaultChanged:(NSNotification *)note

    NSLog(@"Changed");

但如果我的容器应用程序被发送到后台,则永远不会调用此通知 - 所以我无法知道用户默认值何时更改。

如何获取容器应用中的信息(以便在内部更新)?

【问题讨论】:

***.com/questions/17307456/… 探索 Darwin 通知以解决该问题。 【参考方案1】:

我可能弄错了,但是 NSNotification 主要在主线程中运行,这意味着您永远不会收到该通知。

此外,当视图被卸载时,您应该取消订阅任何通知,在这种情况下,我认为在那里订阅不是一个好主意。

在这种情况下,我要做的只是在每次应用唤醒时检查 NSUserDefaults(您可以在 AppDelegate 上激活委托方法,例如:“applicationDidBecomeActive”

【讨论】:

以上是关于在应用扩展和容器应用之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7.3,共享扩展,似乎无法将数据从扩展传递到容器应用程序

如何在 iOS 应用程序和今日视图扩展程序之间共享数据

NSKeyedArchiver 并在目标之间共享自定义类

从 iOS 容器应用与应用扩展共享 Firebase 身份验证会话

如何在应用程序和它的扩展之间共享一个类?

与应用程序和扩展程序共享时,UserDefaults 数据存储在哪里?