WCSession transferUserInfo 仅适用于前台
WCSession transferUserInfo only works in Foreground
我正在使用 WCSession 的 tranferUserInfo
在手表和 iOS 应用程序之间发送数据,以获取当任一产品处于后台时需要处理的信息。这在模拟器上 100% 的时间都有效,但从未在实际设备上有效。
通过使用断点,我发现 func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
从不在后台调用,而是在应用程序转到前台时立即调用。很明显 session.transferUserInfo(data)
正在调用,但在后台状态下没有收到。同样 运行 完全相同的代码,但在模拟器上运行完美。
我是 运行 iOS 9.3.2,观看 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)
}
})
}
发送应用程序在后台时,双方都可以发送。
这意味着
- 如果您在没有连接的情况下发送,
- 然后您的发送应用进入后台或停止,
- 那就有联系了
- -> 发送 OS 将发送。
手表中的应用程序OS 2 无法在后台执行任何操作。所以收不到。
在 iOS,应用程序无法在后台时将自己带到前台。所以 dispatch_async(dispatch_get_main_queue() 在这里没有意义。
我刚刚观看了 WWDC 2015 的 Watch Connectivity session。似乎 transferUserInfo
无法被 iOS 接收,直到应用程序处于前台。这当然是我在实际设备上看到的。那么这里的问题,以及让我失望的是,在撰写本文时,模拟器确实在后台接收到这些消息。这不是正确的行为,因此应被视为模拟器功能中的错误。
出于我的目的,当 iOS 在后台时,我应该能够使用 sendMessage
从手表到 iOS。然而,反过来就不一样了。要使用 sendMessage
从 iOS 到手表,手表必须在前台。
我正在使用 WCSession 的 tranferUserInfo
在手表和 iOS 应用程序之间发送数据,以获取当任一产品处于后台时需要处理的信息。这在模拟器上 100% 的时间都有效,但从未在实际设备上有效。
通过使用断点,我发现 func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
从不在后台调用,而是在应用程序转到前台时立即调用。很明显 session.transferUserInfo(data)
正在调用,但在后台状态下没有收到。同样 运行 完全相同的代码,但在模拟器上运行完美。
我是 运行 iOS 9.3.2,观看 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)
}
})
}
发送应用程序在后台时,双方都可以发送。
这意味着
- 如果您在没有连接的情况下发送,
- 然后您的发送应用进入后台或停止,
- 那就有联系了
- -> 发送 OS 将发送。
手表中的应用程序OS 2 无法在后台执行任何操作。所以收不到。
在 iOS,应用程序无法在后台时将自己带到前台。所以 dispatch_async(dispatch_get_main_queue() 在这里没有意义。
我刚刚观看了 WWDC 2015 的 Watch Connectivity session。似乎 transferUserInfo
无法被 iOS 接收,直到应用程序处于前台。这当然是我在实际设备上看到的。那么这里的问题,以及让我失望的是,在撰写本文时,模拟器确实在后台接收到这些消息。这不是正确的行为,因此应被视为模拟器功能中的错误。
出于我的目的,当 iOS 在后台时,我应该能够使用 sendMessage
从手表到 iOS。然而,反过来就不一样了。要使用 sendMessage
从 iOS 到手表,手表必须在前台。