ChromeCast后台video播放支持iOS

我有一个问题,当我的应用程序进入后台chromecast iOS api的GCKSocketclosures,我得到这个错误从api的types

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

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

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

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

即使应用程序转到后台,如何保持播放仍然存在?

这里是从api的日志logging

 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将closures套接字,并且此时不是可configuration的项目。 但是,这并不意味着在Cast设备上的媒体播放应该停止; 其实正确的行为如下:

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

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

换句话说,确实是接收方应该有逻辑来决定是否必须停止播放或继续播放,为此,必须能够确定设备断开是否是隐式或显式引起的。 在当前的接收器SDK API中,不幸的是,它不包含在接收器获得的onSenderDisconnected事件中; 在接收器的下一次更新中,它将会改变,所以接收器可以看到为什么断开连接正在发生,至less需要区分明确的和隐式的。 那么它可以实现这个逻辑。 同时,发件人需要有一个带外频道发送一条消息,表明其明确的意图。

更新: 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()方法一次就可以进入后台。

我发现这个问题是,当你回到应用程序,你会在几秒钟后有一个networking错误,因为谷歌铸造试图重新连接到设备。

我修正了错误发生时的重新连接,并在之前标识了它在后台input的标识。

参考: 如何保持GCKCastSession活动时,应用程序进入后台