В моем проекте я хочу использовать одну базу данных Realm с моим приложением iOS 10 и моим приложением watchOs 3 одновременно. Итак, что я сделал, так это добавил фреймворки во встроенные двоичные файлы для трех разных целей. Это сработало очень хорошо, но расширение watchKit, похоже, не распознает объекты, которые я создал в среде iOS. Как возможно иметь общую базу данных Realm между этими двумя устройствами?
Делитесь данными Realm с WatchOS
Ответы (2)
Обновление: Хорошо, благодаря хризамансе, я провел дополнительное исследование это.
Оказывается, группы приложений больше невозможны в watchOS 2. Приложения 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 на данный момент устарели.
WatchConnectivity
.
- person chrisamanse; 28.09.2016
Для 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)