在 Watch Extension 和 iPhone 上使用相同的启用了 iCloud 的 CoreData 存储
Posted
技术标签:
【中文标题】在 Watch Extension 和 iPhone 上使用相同的启用了 iCloud 的 CoreData 存储【英文标题】:Using same iCloud enabled CoreData store across Watch Extension and iPhone 【发布时间】:2015-05-14 14:58:53 【问题描述】:从 Apple Watch Extension 打开 iCloud Enabled CoreData 商店时,我看到了一些奇怪的行为。 我在所有目标中使用相同的 iCloud 容器。
这是一张图片,显示了 ubiquity 容器内的文件夹(ubiquity 容器)结构:
看起来它为 iPhone 和 Watch 创建了不同的商店
我在 iPhone 应用程序和 Watch Extension 之间共享相同的 CoreData 堆栈。任何想法为什么会发生这种情况? 如果我理解正确,它会将 iPhone 应用程序和 Watch Extension 视为单独的用户吗?
如果有人可以提供建议,我将不胜感激。
【问题讨论】:
【参考方案1】:您应该使用应用组在 Watch 和 iPhone 之间共享同一个 Core Data 存储。为两个目标启用应用程序组,在您的配置文件中配置它,然后像这样获取您的持久存储 URL:
NSURL *storeURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:appGroupIdentifier];
手表将通过同样为应用组启用的 WatchKit 扩展访问 Core Data 存储。参见例如图 4.1 在 Apple 的App Extension Programming Guide.
【讨论】:
我将它用于非 iCloud 设置。或者你是说我也需要在共享组中拥有泛在容器,但我相信这是不可能的...... 我的问题是 NSPersistentStoreCoordinator.addPersistentStoreWithType 在 SAME ubiquity 容器中打开了不同的商店(见上面的截图 - Phone & Watch 的 GUID 不同),我相信它的行为就像它的不同 iCloud 用户 我猜你必须将数据从手表传递到应用程序,然后将其存储在 Core Data 中,而不是让手表直接访问它。【参考方案2】:考虑让您的 WatchKit 扩展程序使用 openParentApplication 与父应用程序通信。使用 openParentApplication 很容易实现,并有助于保持 WatchKit 扩展中的代码简单快速。
从 WatchKit 扩展接口控制器,调用 openParentApplication。
NSDictionary *requst = @@"request":@"myRequest";
[InterfaceController openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error)
if (error)
NSLog(@"%@", error);
else
// DO STUFF
];
然后,使用应用程序回复
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
考虑在主应用程序中使用 JSON 数据 (NSJSONSerialization) 来响应手表扩展。
【讨论】:
在此方法中每次初始化核心数据堆栈并获取记录可能很耗时。我也将失去监控无处不在的更新的能力。 可能在手表上以只读模式打开存储,而不是使用 openParentApp 进行编辑可能是一个解决方案,但我仍然需要每次都初始化核心数据堆栈。我想知道是否会将单例实例保留在内存中。需要尝试一下以上是关于在 Watch Extension 和 iPhone 上使用相同的启用了 iCloud 的 CoreData 存储的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中
在 Apple Watch 和 iPhone 之间使用 WCSession 共享数据