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];
   } );
}