我正在使用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及其似乎无法与背景状态一起正常工作缺少什么?

仅供参考-在应用程序进入前台之前,永远不会命中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)
            }
        })
    }

最佳答案

我刚刚看了WWDC 2015的Watch Connectivity session 。似乎只有在应用程序出现在前台之前,iOS才能接收到transferUserInfo。当然,这是我在实际设备上看到的。然后,这里的问题以及使我不禁想到的是,撰写本文时,模拟器在后台时确实会收到这些消息。这不是正确的行为,因此应被视为模拟器功能中的错误。

出于我的目的,当iOS处于后台时,我应该能够从手表到iOS使用sendMessage。但是,相反情况并非如此。要将iOS的sendMessage使用到手表,手表必须在前台。

10-07 19:13
查看更多