ChromeCast背景视频播放支持iOS
我有一个问题,当我的应用程序进入后台时,chromecast iOS api的GCKSocket关闭,我从api中得到这种类型的错误ChromeCast背景视频播放支持iOS,ios,objective-c,google-cast,chromecast,Ios,Objective C,Google Cast,Chromecast,我有一个问题,当我的应用程序进入后台时,chromecast iOS api的GCKSocket关闭,我从api中得到这种类型的错误 -[GCKCastSocket socketDidDisconnect:withError:] socketDidDisconnect:withError: "(null)" 然后,如果我将应用程序置于前台,api会自动创建套接字,并将播放状态设置为暂停。如果我现在尝试再次播放视频,它将正常播放 我开始在后台线程上播放媒体,如下所示 dispatch_asyn
-[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会关闭套接字,此时这不是一个可配置项。然而,这并不意味着你的媒体播放应该停止;事实上,正确的行为如下:
- 如果用户已明确断开自己与播放设备的连接,并且她是最后一个连接到接收器的设备,则接收器应停止播放,否则接收器应继续播放
更新:Receiver SDK已更新,以获得可以判断发送方是隐式还是显式断开连接的信息,请参阅。有一种黑客攻击,可帮助在连接进入后台时保持连接的活动状态 对于不断开连接的自定义会话,您可以将对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()
我发现的问题是,当你返回应用程序时,几秒钟后就会出现网络错误,因为GoogleCast正在尝试重新连接设备
我修复了错误发生时重新连接的问题,之前在后台输入了一个标志来标识错误
参考资料:后台模式下的应用程序和后台线程不相关。因此,应该使用哪种后台模式来支持chromecast播放,就像airplay一样,我们使用音频后台模式的音频会话如果您不需要提交到AppStore,任何后台模式都可以,前提是chromecast将在后台模式下工作。我不熟悉。我已经为airplay定义了音频背景模式,那么为什么它不工作呢?谢谢你的回答,我应该在应用程序进入睡眠或背景后尝试向接收方发送消息吗?可能会告诉接收者这是一个隐式/显式断开连接否,如果你进入后台或超出范围,接收者会意识到你已经离开,并认为你断开了连接,因为你没有发送显式消息,所以应该将其解释为隐式消息。仅当用户明确断开连接时才发送消息(在修复生效之前),但当前演示接收器应用程序在发送者进入后台后自动停止,如何克服此问题?这是一个示例应用程序;确保您的seder应用程序未在断开连接时发送stopApplication,然后编写您自己的自定义接收器以执行我概述的逻辑。好的,我已通过在接收器端为mediaelement stop实现一个单独的方法来做到这一点,一旦从发送方调用了[self.mediacontrolchannel stop]方法。并从接收器端的onDiscconect中注释出停止mediaelement的代码。