我有一个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应用程序?
答案 0 :(得分:1)
我发现相当令人满意的解决方案是使用MMWormhole库。
它的工作原理是使用CFNotificationCenter Darwin Notifications并在共享应用程序组中编写/读取数据文件,从而实现iOS应用程序和应用程序扩展之间的即时通信(Watch app,今天的小部件等)。 / p>
基本代码如下:
虫洞初始化
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
}
}
就这么简单。
答案 1 :(得分:0)
不容易。无法在两个应用程序之间发送直接通信。
我目前在这方面的建议是使用磁盘上的文件,其中包含从一个应用程序更改为另一个应用程序的任何内容的objectID。
当您检测到保存到磁盘时,您编写的文件例如是JSON,最多包含三个数组:update,insert,delete。文件名应该是某种形式的时间戳。
另外,您应该正在查看其他应用程序创建的任何文件的目录并使用它们。加载ObjectID,然后从ala iCloud或iOS 9中创建远程通知。然后在处理后删除文件。
启动时,从其他商店删除所有文件,因为您将自动了解发布前发生的任何事情。
不简单但相当直接。