[英]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正在尝试重新连接到该设备。
我修复了错误发生时的重新连接,并带有一个标志,用于识别之前输入的背景。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.