WCSession transferUserInfo仅适用于Foreground

时间:2016-06-29 05:31:54

标签: ios xcode swift watch-os-2

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

通过使用断点,我发现func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])永远不会在后台调用,但会在将应用程序带到前台时立即调用。显然,session.transferUserInfo(data)被调用但未在后台状态中被接收。再次运行完全相同的代码但在模拟器上运行完美。

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

我对transferUerInfo遗漏了什么以及它似乎无法正常处理背景状态?

FYI - 在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)
            }
        })
    }

2 个答案:

答案 0 :(得分:1)

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

出于我的目的,当iOS处于后台时,我应该能够将手表中的sendMessage用于iOS。然而,相反的情况并非如此。要将iOS中的sendMessage用于手表,手表必须位于前台。

答案 1 :(得分:0)

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

这意味着

  • 如果您在没有连接的情况下发送,
  • 然后您的发送应用程序进入后台或停止,
  • 然后有一个连接
  • - >发送操作系统将发送。

watchOS 2中的应用无法在后台执行任何操作。所以它无法接收。

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