在 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 存储的主要内容,如果未能解决你的问题,请参考以下文章

Watch Kit 的推送通知证书/配置文件

iOS之Apple Watch简介和使用

AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中

在 Apple Watch 和 iPhone 之间使用 WCSession 共享数据

如何在 iPhone 应用程序和 Apple Watch 之间共享数据?

Apple Watch 是不是有可能仅在 Apple Watch 和 iPhone 都被锁定时才收到通知?