WCSession transferUserInfo 仅适用于前台

WCSession transferUserInfo only works in Foreground

我正在使用 WCSession 的 tranferUserInfo 在手表和 iOS 应用程序之间发送数据,以获取当任一产品处于后台时需要处理的信息。这在模拟器上 100% 的时间都有效,但从未在实际设备上有效。

通过使用断点,我发现 func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) 从不在后台调用,而是在应用程序转到前台时立即调用。很明显 session.transferUserInfo(data) 正在调用,但在后台状态下没有收到。同样 运行 完全相同的代码,但在模拟器上运行完美。

我是 运行 iOS 9.3.2,观看 OS 2.2.1。显然,此功能旨在处理后台状态下的通信,因此我相信模拟器正在按预期工作。我尝试将发送方和接收方都包装在 dispatch_async(dispatch_get_main_queue(), { 块中,但无济于事。

关于 transferUerInfo 以及它似乎无法在背景状态下正常工作,我错过了什么?

仅供参考 - 在 didRecieveUserInfo 开头设置的断点在应用程序进入前台之前永远不会命中。

func transferInfo(data:[String: AnyObject])
    {
        dispatch_async(dispatch_get_main_queue(), {
            if #available(watchOSApplicationExtension 2.2, *)
            {
                if #available(iOS 9.3, *)
                {
                    if self.session.activationState == .Activated
                    {
                        self.session.transferUserInfo(data)
                    }
                    else
                    {
                        NSNotificationCenter.defaultCenter().postNotificationName("alertError", object: self, userInfo: ["error":"Failed to transfer"])
                    }
                }
                else
                {
                    self.session.transferUserInfo(data)
                }
            }
            else
            {
                self.session.transferUserInfo(data)
            }
        })
    }

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
    {
        dispatch_async(dispatch_get_main_queue(), {
            for delegate in self.watchCommsProtocols
            {
                delegate.watchCommsDidUpdateInfo!(userInfo)
            }
        })
    }

发送应用程序在后台时,双方都可以发送。

这意味着

  • 如果您在没有连接的情况下发送,
  • 然后您的发送应用进入后台或停止,
  • 那就有联系了
  • -> 发送 OS 将发送。

手表中的应用程序OS 2 无法在后台执行任何操作。所以收不到。

在 iOS,应用程序无法在后台时将自己带到前台。所以 dispatch_async(dispatch_get_main_queue() 在这里没有意义。

我刚刚观看了 WWDC 2015 的 Watch Connectivity session。似乎 transferUserInfo 无法被 iOS 接收,直到应用程序处于前台。这当然是我在实际设备上看到的。那么这里的问题,以及让我失望的是,在撰写本文时,模拟器确实在后台接收到这些消息。这不是正确的行为,因此应被视为模拟器功能中的错误。

出于我的目的,当 iOS 在后台时,我应该能够使用 sendMessage 从手表到 iOS。然而,反过来就不一样了。要使用 sendMessage 从 iOS 到手表,手表必须在前台。