1

我正在开发 Apple Watch 的扩展程序,我需要与包含的应用程序进行通信。

MMWormwhole 似乎是这种交流方式的好方法。问题是我的消息在后台运行时没有传递到包含的应用程序,当它从openParentApplication.

有什么方法可以让 MMWormwhole 在后台模式下接收消息?

4

2 回答 2

1

我以另一种方式使用虫洞:从应用程序到手表扩展程序的通信。您似乎可以在您已经进行userInfo的调用的参数中传递您的消息,而不是使用虫洞。openParentApplication

但是,如果出于复杂的原因您想要获取其他消息或您可以手动签入该application: handleWatchKitExtensionRequest: reply:方法的任何内容。就像是:

    if let updatedMessage: AnyObject = wormhole.messageWithIdentifier(updatedKey) {
            processUpdatedWormholeMessage(updatedMessage)
    }

即使应用程序在后台也应该可以工作。

于 2015-05-02T17:15:46.230 回答
1

对的,这是可能的。但是您必须确保 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];
   } );
}
于 2015-05-02T22:52:51.453 回答