[英]How to keep XMPP connection alive in the IOS App when app in background?
[英]How to keep GCKCastSession alive when app goes to background
我正在使用最新的iOS版Google Cast SDK(版本3.1.1.10003),并且我们的应用正在远程控制Google Cast设备,例如,它会改变音量。 当我们的应用程序进入后台时,它也需要这样做。
但是,当应用程序进入后台时, GCKSessionManager
调用suspendSessionWithReason:
也就是说,该会话将被暂停,因此我们的应用无法再控制它。
当应用程序进入后台时,如何使GCKSessionManager
不暂停会话?
编辑 :我在下面提供了一个解决方案,但是由于重新连接时出现严重延迟,因此对用户不友好。
在最新的Google Cast SDK中,您可以在类似的选项中进行设置:
let criteria = GCKDiscoveryCriteria(applicationID: kGCKDefaultMediaReceiverApplicationID)
var options = GCKCastOptions(discoveryCriteria: criteria)
options.suspendSessionsWhenBackgrounded = false
GCKCastContext.setSharedInstanceWith(options)
但是,无论如何,会话会因丢失的网络连接而终止。 诀窍变成了从设备播放“空”音频文件,从而使它保持活动状态。 愚蠢地认为这必须是行业标准。
当应用程序进入后台时,当Google Cast SDK调用GCKSessionManager.suspendSessionWithReason
时,一种解决方案是用另一种实现替换此方法,该实现检查原因是否为.AppBackgrounded
,然后实际上忽略该调用。
这样,当应用程序进入后台时,SDK不会立即终止会话,但稍后仍会暂停会话。 但是,可以从后台模式重新启动会话-但是这会花费大量时间,并且从用户的角度来看,这种延迟是负面的。 此外,会话在不“与之交谈”几秒钟后又再次暂停。
任何更好的解决方案仍然非常感激。
extension GCKSessionManager {
static func ignoreAppBackgroundModeChange() {
let oldMethod = class_getInstanceMethod(GCKSessionManager.self, #selector(GCKSessionManager.suspendSessionWithReason))
let newMethod = class_getInstanceMethod(GCKSessionManager.self, #selector(GCKSessionManager.suspendSessionWithReasonIgnoringAppBackgrounded))
method_exchangeImplementations(oldMethod, newMethod)
}
func suspendSessionWithReasonIgnoringAppBackgrounded(reason: GCKConnectionSuspendReason) -> Bool {
guard reason != .AppBackgrounded else { return false }
return suspendSessionWithReason(reason)
}
}
现在我们需要做的就是调用GCKSessionManager.ignoreAppBackgroundModeChange()
。
编辑:
从最新的Google Cast SDK开始,它提供了一个新选项,可以使会话在后台保持活动状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.