与WatchOS共享Realm数据

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

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

事实certificate,应用程序组不再可能在watchOS 2上。观看应用程序不再作为电话分机运行; 他们现在是两个孤立的进程没有任何共享资源。

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


原文: iOS应用程序和扩展(今日小部件和watchOS应用程序)需要被视为两个完全独立的实体在他们自己的独立容器中。 默认情况下,扩展名不能访问其父应用程序的容器内的任何文件。 如果您要将Realm文件保存到默认path(即“文档”文件夹),那么watchOS应用程序无法从此处访问它。

幸运的是,可以使用iOS的“应用程序组”function来指定父iOS应用程序和watchOS应用程序都可以访问的共享文件夹,并且可以读取和写入其中的任何Realm文件。

一旦您在App Groups启用了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版本在这一点上是过时的。

对于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)