我正在使用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)
}
})
}
答案 0 :(得分:1)
我刚刚观看了WWDC 2015上的Watch Connectivity会话。似乎在应用程序位于前台之前,iOS无法接收transferUserInfo
。这当然是我在实际设备上看到的。那时的问题,以及让我失望的是,本文中的模拟器在后台接收这些消息。这不是正确的行为,因此应该被视为模拟器运行中的错误。
出于我的目的,当iOS处于后台时,我应该能够将手表中的sendMessage
用于iOS。然而,相反的情况并非如此。要将iOS中的sendMessage
用于手表,手表必须位于前台。
答案 1 :(得分:0)
当发送应用程序处于后台时,双方都可以发送。
这意味着
watchOS 2中的应用无法在后台执行任何操作。所以它无法接收。
在iOS上,应用程序在后台时无法将自己置于前台。所以dispatch_async(dispatch_get_main_queue()在这里没有意义。