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