我正在开发 Apple Watch 的扩展程序,我需要与包含的应用程序进行通信。
MMWormwhole 似乎是这种交流方式的好方法。问题是我的消息在后台运行时没有传递到包含的应用程序,当它从openParentApplication
.
有什么方法可以让 MMWormwhole 在后台模式下接收消息?
我正在开发 Apple Watch 的扩展程序,我需要与包含的应用程序进行通信。
MMWormwhole 似乎是这种交流方式的好方法。问题是我的消息在后台运行时没有传递到包含的应用程序,当它从openParentApplication
.
有什么方法可以让 MMWormwhole 在后台模式下接收消息?
我以另一种方式使用虫洞:从应用程序到手表扩展程序的通信。您似乎可以在您已经进行userInfo
的调用的参数中传递您的消息,而不是使用虫洞。openParentApplication
但是,如果出于复杂的原因您想要获取其他消息或您可以手动签入该application: handleWatchKitExtensionRequest: reply:
方法的任何内容。就像是:
if let updatedMessage: AnyObject = wormhole.messageWithIdentifier(updatedKey) {
processUpdatedWormholeMessage(updatedMessage)
}
即使应用程序在后台也应该可以工作。
对的,这是可能的。但是您必须确保 iPhone 上的主应用程序在发送回复之前没有被挂起。这可以通过在文档中指定的 handleWatchKitExtensionRequest 中启动后台任务来完成。
iPhone 上主应用的应用委托中的代码:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void ( ^)( NSDictionary * ))reply
{
__block UIBackgroundTaskIdentifier watchKitHandler;
watchKitHandler = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"backgroundTask"
expirationHandler:^{
watchKitHandler = UIBackgroundTaskInvalid;
}];
if ( [[userInfo objectForKey:@"request"] isEqualToString:@"getData"] )
{
// get data
// ...
reply( data );
}
dispatch_after( dispatch_time( DISPATCH_TIME_NOW, (int64_t)NSEC_PER_SEC * 1 ), dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
[[UIApplication sharedApplication] endBackgroundTask:watchKitHandler];
} );
}