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 之间连接的蓝牙信号强度?