gpt4 book ai didi

ios - 使用 Swift 3 和 Realm 同步 Apple Watch 和 iPhone

转载 作者:可可西里 更新时间:2023-11-01 01:19:51 25 4
gpt4 key购买 nike

我需要从 Apple Watch 和 iPhone 显示和修改我的数据结构。

数据库:

我目前正在使用一个简单的 Realm 结构,其中我有一个对象 A 和一个可以容纳很多 A 的对象 B。

所以在 iPhone 上,用户可以创建 B 并添加 A,当然还可以查看所有 A 和 B。

我希望 Apple Watch 显示当前 B 的所有 A,并让用户有机会向他们当前的 B 添加新的 A。

我尝试过的方式:

我想将 hole Realm 文件从 iPhone 移动到 watch 或其他方式。 (这是来自互联网的提示)

iPhone 代码:

    override func viewDidLoad() {
super.viewDidLoad()


if WCSession.isSupported() { //makes sure it's not an iPad or iPod
let watchSession = WCSession.default()
watchSession.delegate = self
watchSession.activate()

transferRealmFile()

if watchSession.isWatchAppInstalled {
do {
try watchSession.updateApplicationContext(["foo": "bar"])
} catch let error as NSError {
print(error.description)
}
}
}
}
func transferRealmFile(){
if let path = Realm.Configuration().fileURL {
WCSession.default().transferFile(path, metadata: nil)
}
}

WathcKit 扩展:

  func session(_ session: WCSession, didReceive file: WCSessionFile) {

//set the recieved file to default Realm file
var config = Realm.Configuration()
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
let realmURL = documentsDirectory.appendingPathComponent("data.realm")
if FileManager.default.fileExists(atPath: realmURL.path){
try! FileManager.default.removeItem(at: realmURL)
}
try! FileManager.default.copyItem(at: file.fileURL, to: realmURL)
config.fileURL = realmURL
Realm.Configuration.defaultConfiguration = config
}

然后我每次写入 Realm 时都会调用 transferRealmFile()。这行得通,但我无法解决这个问题:

问题:

  1. It doesn't work if only watchKit App is started.
  2. Apple Watch to iPhone doesn't work the same way. (I think I need to change the didRecived code, but I don't know what)

问题:

您知道谁来解决这 2 个问题,或者您是否知道处理这种情况的更好方法,或者我们在 iPhone 和 Watch 之间的交互方式是否会在 WathcOS 3 中发生变化?

最佳答案

在 watchOS1 中,可以使用 AppGroups 在 iOS 应用程序及其 Watch 扩展之间共享资源(甚至是您的 Realm 数据库)。但是,Apple 在 watchOS 2 中删除了此功能,因此现在在 iOS 和 watchOS 应用程序之间共享数据的唯一方法是通过 WatchConnectivity。看看this回答。

遗憾的是,WatchConnectivity 框架要求 WCSession 在两个设备上都处于事件状态以传输数据,因此您无法真正解决问题 1。

在我看来,更好的解决方案是仅在两个应用程序之间传递更改而不发送整个 Realm 文件,因为您的 Realm 文件可能会变得非常大,因此向前和向后发送它会花费很多时间并且资源,而仅发送更改应该更快。

关于ios - 使用 Swift 3 和 Realm 同步 Apple Watch 和 iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44418523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com