watchAppExtension 中的 NSUserDefault 更改通知处理

NSUserDefault change notification handling in watchAppExtension

我正在创建一个  Watch 应用,只是为了在用户点击 iPhone/host 应用中的 table 视图时在手表上显示一个值。

我想收到共享 UserDefault 上值更改的通知。它在 WatchKit 应用程序和 iOS(主机)应用程序之间共享,因此当用户在主机应用程序中进行任何更改时,我希望收到通知。我做了以下事情:

当用户在应用程序(主机应用程序)中执行某些操作时:

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.app"];
id object = [self.plantsArray objectAtIndex:[self.plantsTable indexPathForSelectedRow].row];
[shared setObject:object forKey:@"data"];
[shared synchronize];

Watchkit扩展中已注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(print) name:NSUserDefaultsDidChangeNotification object:nil];

但遗憾的是我没有收到任何通知,有人有解决方案吗?

我不认为 iOS 在应用程序和扩展程序之间具有 distributed notifications 的能力,通知在两者之间不起作用,相反,您需要找到一种方法,使两者都可以监视更改。例如文件。

因为你已经创建了group,你可以在组文件夹中保留一个文件并在扩展名中添加一个filewatcher,从应用程序更新文件,filewatcher会捕获更改,您的工作就完成了。

对于 filewatcher 请参阅代码 here

希望对您有所帮助。

干杯。

更新

找到File watcher Swift versionhere。感谢 @rivera 添加。

您可以尝试 MMWormHole 提供:

  • iOS 设备和手表之间的通道,使您能够在它们之间来回发送数据。
  • 还提供了一种无需自己处理文件监控即可进行通知的方法。

使用它,这就是在您的应用程序中执行通知所需的所有代码

[self.wormhole passMessageObject:@{@"buttonNumber" : @(1)} identifier:@"button"];

[self.wormhole listenForMessageWithIdentifier:@"button" 
  listener:^(id messageObject) {
    self.numberLabel.text = [messageObject[@"buttonNumber"] stringValue];
}];