MMWormhole 创建了一个连接 iOS 或 OS X 扩展及其包含应用之间的桥梁。Wormhole 用于在两个位置之间传递数据或命令。消息被存档到文件,这些文件被写入应用的共享 App Group。效果与应用和扩展之间的进程间通信非常相似,尽管扩展和包含应用之间不存在真正的进程间通信。
Wormhole 还支持 CFNotificationCenter Darwin 通知,以便支持实时变更通知。当消息传递到 wormhole 时,感兴趣的各方可以监听并在 wormhole 的两侧接收这些变更的通知。当通过 wormhole 发送消息时,效果是几乎立即在两侧更新。
[self.wormhole passMessageObject:@{@"buttonNumber" : @(1)} identifier:@"button"];
[self.wormhole listenForMessageWithIdentifier:@"button"
listener:^(id messageObject) {
self.numberLabel.text = [messageObject[@"buttonNumber"] stringValue];
}];
MMWormhole 示例应用仅适用于您的共享 App Group 标识符和权限,仅作为参照使用
您可以通过使用 CocoaPods 在项目中安装 Wormhole
pod 'MMWormhole', '~> 2.0.0'
MMWormhole 也支持 Carthage。
MMWormhole 设计用于在扩展及其包含应用之间轻松共享非常基本的信息和命令。无论包含应用是否正在运行,Wormhole 都应保持稳定,但只有在应用在后台唤醒时,包含应用中才会触发通知。这使得 MMWormhole非常适合那些通过某种形式的后台模式已经运行包含应用的情况。
将虫洞理解为共享邮箱集合是一种不错的方法。标识符本质上是一个你可以发送信息的唯一邮箱。由于你与它关联的标识符,你知道信息将被发送到何处,但不一定知道收件人何时会接收到信息。如果应用或扩展在后台运行,它们可能不会立即接收到信息。按惯例,信息应该从一侧发送到另一侧,不一定是从你自己发送给自己。当你应用或扩展唤醒时,检查邮箱的内容也是一个很好的习惯,以防你在不在时有人留下信息。
MMWormhole使用NSKeyedArchiver作为序列化媒介,因此任何遵循NSCoding协议的对象都可以作为信息使用。对于许多应用来说,共享简单的字符串、数字或JSON对象足以驱动小部件或Apple Watch应用的UI。信息可以轻松地以归档文件的形式发送和持久化,并在稍后的时间唤醒应用或扩展时读取。
使用MMWormhole非常简单。真正要注意的是,你的应用及其扩展必须支持共享应用组。该组将用于写入代表每个信息的归档文件。虽然可以使用应用组共享较大的文件和结构,包括整个Core Data数据库,但MMWormhole旨在使用它自己的目录来传递信息。因此,最佳实践是使用一个在应用共享应用组内部使用的目录名称来初始化MMWormhole。
使用你的应用组标识符和可选的目录名称初始化MMWormhole
Objective-C
self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"group.com.mutualmobile.wormhole"
optionalDirectory:@"wormhole"];
Swift
let wormhole = MMWormhole(applicationGroupIdentifier: "group.com.mutualmobile.wormhole", optionalDirectory: "wormhole")
带有一个信息的标识符和一个作为信息的遵循NSCoding协议的对象来传递信息
Objective-C
[self.wormhole passMessageObject:@{@"titleString" : title}
identifier:@"messageIdentifier"];
Swift
wormhole.passMessageObject("titleString", identifier: "messageIdentifier")
读取信息有两种选择。你可以通过询问虫洞来在任何时候获取标识符的信息。
Objective-C
id messageObject = [self.wormhole messageWithIdentifier:@"messageIdentifier"];
你也可以监听该信息的更改,并在信息更新时接收通知。
Objective-C
[self.wormhole listenForMessageWithIdentifier:@"messageIdentifier"
listener:^(id messageObject) {
// Do Something
}];
Swift
wormhole.listenForMessageWithIdentifier("messageIdentifier", listener: { (messageObject) -> Void in
if let message: AnyObject = messageObject {
// Do something
}
})
你可以将应用和扩展之间的信息传递想象成一种网络服务。该网络服务有可以读取和写入的端点。你的MMWormhole信息标识符可以以类似的方式思考。设计非常明确的信息标识符是一个很好的习惯,这样你在阅读代码时可以立即知道谁发送了信息以及为何发送,以及信息的可能内容。就像你设计具有清晰语义的网络服务一样,你也应该在虫洞消息方案中这样做。
当你需要支持watchOS 2时,你的通信方案设计尤为重要。MMWormhole支持苹果提供的WatchConnectivity框架,作为快速启动WatchConnectivity基本实现的一种简便方式。这种支持的目的不是为了完全取代WatchConnectivity,并且仔细考虑你的watch应用通信系统以确定MMWormhole最适合的位置是非常重要的。
如果你想在你应用中使用WatchConnectivity支持,这里有两件事情你需要知道
MMWormholeSession 是 MMWormhole 的单例子类,支持监听 WatchConnectivity 中的消息。您应将其用作所有期望从 WatchConnectivity 框架接收到的 MMWormhole 消息的监听器。一旦设置完成监听器,请务必激活会话,以便开始接收消息通知。
在创建您的 wormholes 时应使用以下 MMWormholeSessionTransiting 类型,但请注意不要一次性发送太多消息。您可以通过一次发送太多消息而轻松地过载管道。
MMWormhole 中数据流动的机制由 MMWormholeTransiting 协议定义。该协议的默认实现是名为 MMWormholeFileTransiting,它读取和写入作为应用程序共享容器中归档数据文件的消息。MMWormhole 的用户可以实现自己的协议版本来更改消息传递行为。
有三种新的 MMWormholeTransiting 协议实现支持 WCSession 应用程序上下文、消息和文件传输系统。您在任何时候只能使用 wormhole 的一个中继形式,因此您需要考虑哪种类型的消息系统最适合您应用程序的特定部分。
大多数应用会发现应用程序上下文系统在实时消息和简单持久性之间取得了良好的平衡,因此我们建议从 MMWormholeSessionContextTransiting 开始。查看文档和头文件注释以了解其他消息类型的说明。
您可以使用内置的中继类型之一,通过调用可选的初始化器来设置实例,快速入门 wormhole,并为您的使用情况设置适当的中继类型。
Objective-C
self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"group.com.mutualmobile.wormhole"
optionalDirectory:@"wormhole"
transitingType:MMWormholeTransitingTypeSessionContext];
Swift
let wormhole = MMWormhole(applicationGroupIdentifier: "group.com.mutualmobile.wormhole",
optionalDirectory: "wormhole"
transitingType: .SessionContext)
MMWormhole 需要 iOS 7.0 或更高版本或 OS X 10.10 或更高版本。MMWormholeSession 需要 iOS 9.0 或更高版本。
如果另一端没有收到消息,请检查项目->功能->应用组。
步骤部分应该显示三个勾号。
MMWormhole 由 Conrad Stoll 在 Mutual Mobile 创建。
还要感谢 Wade Spires、Tom Harrington 和 Rene Cacheaux 在容器应用程序及其扩展之间围绕通知的工作和灵感。
MMWormhole 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。