Apple Watch和openParentApplication在后台

时间:2014-12-17 18:01:41

标签: ios watchkit apple-watch

我正在实施一款苹果手表。在我的Watchkit扩展中,我使用该方法与“主应用程序”进行通信。

    [WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) {}];

根据apple documentation,该应用可以在后台处理请求。

When you call the openParentApplication:reply: method, iOS launches or 
wakes up the parent app in the background and calls the
application:handleWatchKitExtensionRequest:reply:method of its app delegate.

然而,即使我的方法中没有代码,我的应用程序也始终处于活动状态, handleWatchKitExtensionRequest

是否有可能提示?

提前致谢

4 个答案:

答案 0 :(得分:2)

根据Apple开发者论坛Apple开发者的官方回应,这是WatchKit Framework Beta 2中的错误。

https://devforums.apple.com/message/1082689#1082689

  

只是要明确一件事,iPhone应用程序已经推出了   背景。在模拟器中,当前正在启动应用程序   前景。这不是设备上的体验。该   文档特别说,“调用该方法会导致iOS   在后台启动应用程序......“。

(第6号)

BTW,昨天Beta 3发布了,也许它已经修好了。

如果iPhone被锁定,你的iOS应用程序还将在后台启动。

答案 1 :(得分:2)

如果您的应用未处于活动状态,则openParentApplication无法激活它。它只能在后台执行任务。要使其正常工作,请务必按照documentation中的说明在handleWatchKitExtensionRequest中启动后台任务。这可以确保iPhone上的主应用程序在发送回复之前不会被暂停。

iPhone上主应用程序的app委托中的代码:

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

答案 2 :(得分:1)

我认为"功能"中缺少背景模式。主应用程序的部分,将来会添加。

我尝试启用所有当前支持的后台模式,但没有一个工作(即主应用程序始终启动)。

我的小费 - 耐心等到下一个测试版。

答案 3 :(得分:0)

我有一个完全相同的问题,将WatchKit连接到现有的应用程序上。我在info.plist中将UIApplicationExitsOnSuspend(又名应用程序不在后台运行)设置为YES。将其更改为NO,错误就会消失。