繁体   English   中英

ChromeCast背景视频播放支持iOS

[英]ChromeCast background video playback support iOS

我有一个问题,当我的应用程序进入后台时,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)"

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

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

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

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

更新: Receiver SDK已更新为具有可以判断发件人是否隐式或显式断开连接的信息,请参阅文档

有一个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正在尝试重新连接到该设备。

我修复了错误发生时的重新连接,并带有一个标志,用于识别之前输入的背景。

参考: 当应用程序转到后台时如何使GCKCastSession保持活动状态

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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