Apple Watch 和 openParentApplication 在后台

Posted

技术标签:

【中文标题】Apple Watch 和 openParentApplication 在后台【英文标题】:Apple Watch and openParentApplication in background 【发布时间】:2014-12-17 18:01:41 【问题描述】:

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

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

根据苹果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

如果可能的话,有什么建议吗?

提前致谢

【问题讨论】:

【参考方案1】:

根据 Apple 开发者论坛上 Apple 开发人员的官方回复,这是 WatchKit 框架 Beta 2 中的错误。

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

为了澄清一件事,iPhone 应用程序是在 背景。在模拟器中,当前正在启动该应用程序 前景。这将不是设备上的体验。这 文档特别指出,“调用该方法会导致 iOS 在后台启动应用程序..."。

(帖子编号 6)

顺便说一句,昨天发布了 Beta 3,也许它已经修复了。

如果 iPhone 被锁定,您的 iOS 应用也会在后台启动。

【讨论】:

感谢您的信息...我会检查它 发行说明(Beta 3)- WKInterfaceController 方法 openParentApplication:reply:现在在 iPhone(或 iOS 模拟器)解锁或锁定时在后台启动包含的应用程序。【参考方案2】:

如果您的应用未激活,openParentApplication 将无法激活它。它只能在后台执行任务。为此,请务必按照documentation 中的指定在handleWatchKitExtensionRequest 中启动后台任务。这可确保 iPhone 上的主应用程序在发送回复之前不会暂停。

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

【讨论】:

【参考方案3】:

我认为主应用的“功能”部分缺少后台模式,以后会添加。

我尝试打开所有当前支持的后台模式,但它们都不起作用(即主应用程序总是在启动)。

我的建议 - 耐心等待下一个测试版。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Apple Watch 和 openParentApplication 在后台的主要内容,如果未能解决你的问题,请参考以下文章

iOS之Apple Watch简介和使用

applewatch紧握无反应

Apple Watch 和 openParentApplication 在后台

Apple Watch的通信机制

Apple Watch的UI

如何将用户从 Apple Watch 通知转移到 Apple Watch App?