5

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

4

2 回答 2

5

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

事实证明,在 watchOS 2 上不再支持 App Groups。Watch 应用不再作为扩展程序在手机上运行;它们现在是两个孤立的进程,没有任何共享资源。

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


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

值得庆幸的是,可以使用 iOS 的“应用程序组”功能来指定父 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)

Realm 网站上有一个教程更详细地解释了如何进行这项工作,但是此时 API 和 Swift 版本已经过时。

于 2016-09-27T17:14:58.933 回答
0

对于斯威夫特 3

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

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)
于 2017-10-27T06:38:32.420 回答