MMWormwhole 在后台与应用程序通信
MMWormwhole communication with the app in background
我正在为 Apple Watch 开发扩展程序,我需要与包含的应用程序进行通信。
MMWormwhole 似乎是此类通信的好方法。问题是当从 openParentApplication
.
打开时,当它在后台 运行 时,我的消息没有传递到包含应用程序
有没有办法让MMWormwhole在后台模式下接收消息?
我以另一种方式使用虫洞:从应用程序到手表扩展程序的通信。您似乎可以不使用虫洞,而是在您已经进行的 openParentApplication
调用的 userInfo
参数中传递您的消息。
但是,如果您出于复杂的原因想要接收一些 other 消息或任何您可以在 application: handleWatchKitExtensionRequest: reply:
方法中手动检查的内容。类似于:
if let updatedMessage: AnyObject = wormhole.messageWithIdentifier(updatedKey) {
processUpdatedWormholeMessage(updatedMessage)
}
即使应用程序在后台也应该可以正常工作。
是的,这是可能的。但是你必须确保 iPhone 上的主应用程序在发送回复之前没有被挂起。这可以通过在 documentation 中指定的 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];
} );
}
我正在为 Apple Watch 开发扩展程序,我需要与包含的应用程序进行通信。
MMWormwhole 似乎是此类通信的好方法。问题是当从 openParentApplication
.
有没有办法让MMWormwhole在后台模式下接收消息?
我以另一种方式使用虫洞:从应用程序到手表扩展程序的通信。您似乎可以不使用虫洞,而是在您已经进行的 openParentApplication
调用的 userInfo
参数中传递您的消息。
但是,如果您出于复杂的原因想要接收一些 other 消息或任何您可以在 application: handleWatchKitExtensionRequest: reply:
方法中手动检查的内容。类似于:
if let updatedMessage: AnyObject = wormhole.messageWithIdentifier(updatedKey) {
processUpdatedWormholeMessage(updatedMessage)
}
即使应用程序在后台也应该可以正常工作。
是的,这是可能的。但是你必须确保 iPhone 上的主应用程序在发送回复之前没有被挂起。这可以通过在 documentation 中指定的 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];
} );
}