Делитесь данными Realm с WatchOS

В моем проекте я хочу использовать одну базу данных Realm с моим приложением iOS 10 и моим приложением watchOs 3 одновременно. Итак, что я сделал, так это добавил фреймворки во встроенные двоичные файлы для трех разных целей. Это сработало очень хорошо, но расширение watchKit, похоже, не распознает объекты, которые я создал в среде iOS. Как возможно иметь общую базу данных Realm между этими двумя устройствами?


person Luk579    schedule 22.09.2016    source источник


Ответы (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 на данный момент устарели.

person TiM    schedule 27.09.2016
comment
Начиная с watchOS 2.0 группы приложений больше не применяются. forums.developer.apple.com/thread/3927 - person chrisamanse; 28.09.2016
comment
Единственный выбор, который у нас есть, — это использование фреймворка WatchConnectivity. - person chrisamanse; 28.09.2016
comment
Ой! Это новость для меня! Спасибо за наводку! - person TiM; 03.10.2016
comment
Привет @TiM, что мне нужно использовать, если я пытаюсь поделиться базой данных области по умолчанию между приложением, общим расширением или расширением клавиатуры, у меня есть эта проблема: github.com/realm/realm-cocoa/issues/5594, помогите, пожалуйста? Т_Т - person user_Dennis_Mostajo; 09.02.2018

Для 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)
person Nikhil Manapure    schedule 27.10.2017