繁体   English   中英

当应用程序进入后台时如何保持GCKCastSession存活

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM