ChromeCast背景视频播放支持iOS

时间:2014-02-25 10:46:32

标签: ios objective-c google-cast chromecast

我有一个问题,当我的应用程序进入后台时,chromecast iOS api的GCKSocket关闭,我从api得到这种错误

-[GCKCastSocket socketDidDisconnect:withError:]  socketDidDisconnect:withError: "(null)"

然后如果我将应用程序带到前台,api会自动创建套接字并将播放状态设置为暂停。如果我现在尝试再次播放视频,它会正常播放。

我正在开始在这样的后台线程上播放媒体。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,
                                             0), ^ {
[[CastViewController instance] castMedia:self.media];      

});

即使应用程序进入后台,如何使播放保持活动状态?

这是从api

的日志记录
2014-02-25 17:19:01.388 CastVideos[28470:60b] -[GCKCastSocket disconnect] disconnect

2014-02-25 17:19:01.391 CastVideos[28470:60b] -[GCKCastSocket doTeardownWithError:] doTeardownWithError

2014-02-25 17:19:01.395 CastVideos[28470:60b] -[GCKCastSocket doTeardownWithError:] notifying delegate that socket is disconnected

2014-02-25 17:19:01.399 CastVideos[28470:60b] -[GCKHeartbeatChannel didDisconnect] disconnected - stopping heartbeat timer if necessary

2014-02-25 17:19:01.457 CastVideos[28470:60b] -[GCKCastSocket socketDidDisconnect:withError:] socketDidDisconnect:withError: "(null)"

2 个答案:

答案 0 :(得分:9)

目前,当您转到后台时,Cast iOS SDK会关闭套接字,此时这不是可配置项。但是,这并不意味着Cast设备上的媒体播放应该停止;事实上,正确的行为如下:

  • 如果用户明确地将自己与演员设备断开连接,并且如果她是接收器的最后一个连接设备,那么接收器应该停止播放,否则接收器应继续播放。

这里的关键是“明确”部分;例如,如果发送方超出wifi范围并断开连接,或者发送方进入休眠状态并断开连接,则这些被视为“隐式”断开连接,不应导致接收方停止。

换句话说,真正的接收者应该有逻辑来决定它是否必须自行停止或继续播放,并且为了工作,它必须能够决定是否隐式地导致设备断开连接或明确。在当前的接收器SDK API中,遗憾的是,它不包含在接收器获得的onSenderDisconnected事件中;在接收器的下一次更新中,它将发生变化,因此接收器可以看到断开发生的原因,至少与区分显式和隐式的一样多。然后它可以实现逻辑。同时,发送者需要有一个带外信道来发送一条表明其明确意图的信息。

更新:Receiver SDK已更新为可以判断发件人是隐式还是明确断开的信息,请参阅docs

答案 1 :(得分:0)

有一个hack有助于在后台进行连接时保持连接。

您可以替换 GCKSessionManager.suspendSession(带:):的调用,以获取不会断开连接的自定义。

extension GCKSessionManager {
    static func ignoreAppBackgroundModeChange() {
        let oldMethod = class_getInstanceMethod(GCKSessionManager.self, #selector(GCKSessionManager.suspendSession(with:)))
        let newMethod = class_getInstanceMethod(GCKSessionManager.self, #selector(GCKSessionManager.suspendSessionIgnoringAppBackgrounded(with:)))
        method_exchangeImplementations(oldMethod, newMethod)

    }

    func suspendSessionIgnoringAppBackgrounded(with reason: GCKConnectionSuspendReason) -> Bool {
        guard reason != .appBackgrounded else { return false }
        return suspendSession(with:reason)
    }
}

只需在任何地方调用方法 ignoreAppBackgroundModeChange(),然后再在背景中输入。

我发现的问题是,当您返回应用时,几秒钟后您将遇到网络错误,因为Google Cast正在尝试重新连接到该设备。

我修复了错误发生时重新连接的问题,并在之前用一个标志来识别它在后台输入。

参考:How to keep GCKCastSession alive when app goes to background