与 WatchOS 共享领域数据

Share Realm Data with WatchOS

在我的项目中,我想在我的 iOS 10 应用程序和我的 watchOs 3 应用程序中同时使用一个领域数据库。所以我所做的是将框架添加到三个不同目标的嵌入式二进制文件中。这碰巧工作得很好,但 watchKit 扩展似乎无法识别我在 iOS 环境中创建的对象。这两个设备之间如何共享 Realm 数据库?

更新: 好的,感谢chrisamanse的提醒,我对此做了更多的研究。

事实证明,应用程序组在 watchOS 2 上不再可用。手表应用程序不再 运行 作为 phone 上的扩展;它们现在是两个没有任何共享资源的独立进程。

因此,这意味着有必要在手表和 phone 上维护一个单独的领域文件,并通过 WatchConnectivity 框架传达对两者所做的任何更改。


原文: iOS 应用程序和扩展(包括 Today 小部件和 watchOS 应用程序)需要被视为两个完全独立的实体,位于各自独立的容器中。默认情况下,扩展无法访问其父应用程序容器内的任何文件。如果您将 Realm 文件保存到默认路径(即 'Documents' 文件夹),watchOS 应用程序无法从那里访问它。

值得庆幸的是,可以使用 iOS 的 'App Groups' 功能来指定一个共享文件夹,父 iOS 应用程序和 watchOS 应用程序都可以访问,并且都可以读取并写入其中的所有 Realm 文件。

在您的应用中启用 App Groups 授权后,只需将您的 Realm 文件位置设置为指向该位置即可。

let sharedContainerURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.my.appgroups.bundleid")!
let realmURL = sharedContainerURL.appendingPathComponent("SharedRealm.realm")

let realmConfiguration = Realm.Configuration()
realmConfiguration.fileURL = realmURL
let realm = try! Realm(configuration: realmConfiguration)

a tutorial on the Realm website 更详细地解释了如何进行这项工作,但是 API 和 Swift 版本此时已过时。

对于Swift 3

我使用以下代码在应用程序和应用程序扩展之间共享 Realm 数据库:

let sharedDirectory: URL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.your.app")! as URL
let sharedRealmURL = sharedDirectory.appendingPathComponent("db.realm")
Realm.Configuration.defaultConfiguration = Realm.Configuration(fileURL: sharedRealmURL)