WCSession transferUserInfo 只在前台工作

3
我正在使用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个回答

2
我刚看了一下WWDC 2015的Watch Connectivity session。看起来,只有当应用程序在前台时,iOS才能接收到transferUserInfo。这就是我在实际设备上看到的情况。然而,这里的问题是,截至本文撰写时,模拟器确实会在后台接收到这些消息。这不是正确的行为,因此应该将其视为模拟器功能中的错误。
对于我的目的,当iOS在后台运行时,我应该能够使用从手表发送sendMessage到iOS。然而,反过来则不成立。要从iOS向手表发送sendMessage,手表必须处于前台。

1

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

这意味着:

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

在watchOS 2中的应用程序无法在后台执行任何操作。因此,它无法接收。

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


在这种情况下,我正在研究iOS端能否在后台接收和处理手表发送的内容。在模拟器上,当处于后台时,手表和iOS都会触发接收断点。然而,仅限于iOS,直到将其带到前台(手表始终在前台)才会触发接收。我同意主线程代码不应该是必需的,但我添加它是因为我知道一些回复会建议使用它,并且我想提前显示它不能解决问题。 - C6Silver
为什么当你无法将应用程序带到前台时,你还想要在后台接收呢? - Gerd Castan
手表向手机发送一条消息,告诉它启动计时器,并使用 GPS 开始跟踪距离等信息。我希望他们能够从手表开始这个过程,而不必去手机上操作。然后当他们打开手机时,这些信息就已经在那里了。目前为止,手机只有在进入前台时才会收到该信号。但是在模拟器上,即使应用程序在后台运行,也会接收到该信号,因此可以按照我的期望工作。 - C6Silver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接