【问题标题】:How to keep GCKCastSession alive when app goes to background当应用程序进入后台时如何保持 GCKCastSession 活动
【发布时间】:2016-12-18 06:23:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios google-cast background-mode


    【解决方案1】:

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

    【讨论】:

    • 在最新的 SDK 会话中在当前项目完成时暂停,原因是“GCKConnectionSuspendReasonNetworkNotReachable”有什么办法克服这个障碍吗?
    • 我也收到了GCKConnectionSuspendReasonNetworkNotReachable 错误,suspendSessionsWhenBackgrounded = true。 Google Cast SDK 4.4.4
    【解决方案2】:

    在最新的 Google Cast SDK 中,您可以像这样在options 中设置它:

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

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

    【讨论】:

    • 您好,我也遇到了同样的问题。根据您的建议,我们从设备播放空音频文件。不确定,我明白。当应用程序已经在后台时,您将如何播放空音频文件以保持会话处于活动状态?
    • @Renu 当你开始投射时,你基本上开始播放空的音频文件。当您进入后台时,您不会开始播放它,IIRC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多