【问题标题】:Apple Watch and openParentApplication in backgroundApple Watch 和 openParentApplication 在后台
【发布时间】: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

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

提前致谢

【问题讨论】:

    标签: ios watchkit apple-watch


    【解决方案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,错误就会消失。

        【讨论】:

          猜你喜欢
          • 2016-05-15
          • 1970-01-01
          • 2016-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多