Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ChromeCast背景视频播放支持iOS_Ios_Objective C_Google Cast_Chromecast - Fatal编程技术网

ChromeCast背景视频播放支持iOS

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

我有一个问题,当我的应用程序进入后台时,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会关闭套接字,此时这不是一个可配置项。然而,这并不意味着你的媒体播放应该停止;事实上,正确的行为如下:

  • 如果用户已明确断开自己与播放设备的连接,并且她是最后一个连接到接收器的设备,则接收器应停止播放,否则接收器应继续播放
这里的关键是“明确”部分;例如,如果发送方超出wifi范围并断开连接,或者如果发送方进入睡眠状态并断开连接,则这些被视为“隐式”断开连接,不应导致接收器停止

换言之,真正应该由接收者来决定是否必须停止或继续播放,并且为了使其工作,必须能够确定设备断开是隐式还是显式导致的。在当前的receiver SDK API中,不幸的是,它没有包含在receiver获得的onSenderDisconnected事件中;在接收器的下一次更新中,它将改变,以便接收器可以看到断开连接发生的原因,至少在区分显式和隐式断开连接时是如此。然后它可以实现逻辑。同时,发送方需要有一个带外通道来发送一条表明其明确意图的消息


更新: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的代码。