我正在使用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
使用到手表,手表必须在前台。