0

我正在使用适用于 iOS 的最新 Google Cast SDK(版本 3.1.1.10003),我们的应用程序正在远程控制 Google Cast 设备,例如它会改变它们的音量。当我们的应用程序进入后台时,它也需要这样做。

但是,当应用程序进入后台时GCKSessionManager调用。suspendSessionWithReason:这就是说,会话将被暂停,因此我们的应用程序无法再控制它。

GCKSessionManager当应用程序进入后台时,如何不暂停会话?

编辑:我在下面提供了一个解决方案,但由于重新连接时出现明显延迟,这对用户不友好。

4

2 回答 2

5

在最新的 Google Cast SDK 中,您可以在选项中设置它,如下所示:

let criteria = GCKDiscoveryCriteria(applicationID: kGCKDefaultMediaReceiverApplicationID)
var options = GCKCastOptions(discoveryCriteria: criteria)
options.suspendSessionsWhenBackgrounded = false
GCKCastContext.setSharedInstanceWith(options)

但是,无论如何,会话会因网络连接丢失而终止。诀窍变成了从设备播放“空”音频文件,使其保持活动状态。愚蠢地认为这一定是行业标准。

于 2018-04-10T00:55:00.600 回答
3

当应用程序进入后台时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 开始,它有一个新选项可以让会话在后台保持活动状态。

于 2016-08-11T13:46:24.900 回答