iPhone 和 Apple Watch 应用之间的 Core Data SQLite 存储更改通知

Posted

技术标签:

【中文标题】iPhone 和 Apple Watch 应用之间的 Core Data SQLite 存储更改通知【英文标题】:Notification of changes in Core Data SQLite store between iPhone and Apple Watch app 【发布时间】:2015-08-12 14:58:33 【问题描述】:

我有一个 iPhone (ios 8) 和 Apple Watch (watchOS 1) 应用程序,它们使用 Core Data(SQLite 商店,放置在共享应用程序组中)共享其数据。两个应用程序都使用共享框架中的相同数据访问代码。 NSPersistentStoreCoordinator 的设置方式如下:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = 
    let sharedContainerURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(self.sharedAppGroup)!
    let storeURL = sharedContainerURL.URLByAppendingPathComponent(self.databaseName)
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

    var error: NSError? = nil
    if coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil 
        fatalError("Unable to add persistent store: \(error)")
    

    return coordinator
()

据我了解,在运行时每个应用程序都有自己的 NSPersistenStoreCoordinator 实例(因为 iPhone 应用程序和 WatchKit 扩展确实有完全独立的地址空间),但这两个连接到完全相同的 SQLite 数据库文件。

当 Watch 应用更改公共 SQLite 存储中的某些数据时如何通知 iPhone 应用,反之亦然:当 iPhone 应用更改公共持久存储中的某些数据时如何通知 Watch 应用?

【问题讨论】:

【参考方案1】:

我发现相当满意的解决方案是使用MMWormhole 库。

它通过使用 CFNotificationCenter Darwin Notifications 和在共享应用程序组中写入/读取数据文件来工作,从而在 iOS 应用程序和应用程序扩展(手表应用程序、今天的小部件等)之间实现即时通信。

基本代码如下:

虫洞初始化

wormhole = MMWormhole(applicationGroupIdentifier: appGroup, optionalDirectory: nil)

将数据对象传递给虫洞

let payload = ["Key": "Value"]
wormhole.passMessageObject(payload, identifier: theSameMessageIdentifier)

侦听来自虫洞的传入对象

wormhole.listenForMessageWithIdentifier(theSameMessageIdentifier)  message -> Void in

    if let payloadDictionary = message as? Dictionary<String, String> 
        // Do some work
     

就这么简单。

【讨论】:

这个库可能实现了 Marcus S. Zarra 在他的回答中提到的想法。【参考方案2】:

不容易。无法在两个应用程序之间发送直接通信。

我目前在这方面的建议是使用磁盘上的文件,其中包含从一个应用程序更改为另一个应用程序的任何对象 ID。

当您检测到保存到磁盘时,您会编写一个文件,例如,JSON 文件并包含最多三个数组:更新、插入、删除。文件名应该是某种形式的时间戳

另外,您应该查看其他应用程序创建的任何文件的目录并使用它们。加载 ObjectID,然后从 ala iCloud 或在 iOS 9 中创建一个远程通知。处理完后删除文件。

在启动时,从其他存储中删除所有文件,因为您会自动知道启动前发生的任何事情。

不简单,但相当直接。

【讨论】:

以上是关于iPhone 和 Apple Watch 应用之间的 Core Data SQLite 存储更改通知的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 和 Apple Watch 应用之间的 Core Data SQLite 存储更改通知

在 Apple Watch 和 iPhone 之间使用 WCSession 共享数据

iPhone 和 Apple Watch 之间的 WatchConnectivity 超时错误

Watch OS 2:是不是可以获得配对的 iPhone 和 Apple Watch 之间连接的蓝牙信号强度?

有没有办法确定 Apple Watch 和 iPhone 之间的粗略距离?

在 Apple Watch 上显示 iPhone 的电池