【问题标题】:How to change `applicationID` in Google Cast dynamically? iOS SDK如何动态更改 Google Cast 中的“applicationID”? iOS SDK
【发布时间】:2021-03-27 13:47:30
【问题描述】:

我像这样在application: didFinishLaunching 中初始化 Google Cast SDK:

let criteria = GCKDiscoveryCriteria(applicationID: kGCKDefaultMediaReceiverApplicationID)
let options = GCKCastOptions(discoveryCriteria: criteria)
GCKCastContext.setSharedInstanceWith(options)

我已尝试将视频内容流式传输到默认媒体接收器,它可以正常工作。

但我需要能够将 kGCKDefaultMediaReceiverApplicationID 更改为自定义接收器应用程序 ID,以将不同的内容发送到我通过 Google Cast SDK 开发人员控制台注册的自定义接收器应用程序。我无法重新启动应用程序以指定不同的应用程序 ID。

在调用GCKCastContext.setSharedInstanceWith(options) 之后,有什么方法可以在应用程序中的某个时间点动态执行此操作?

此方法的调用只工作一次,我无法更新 GCKDiscoveryCriteria:GCKCastContext.setSharedInstanceWith(options)

我使用“google-cast-sdk-no-bluetooth”,版本:4.5.3

在 Android SDK 中,有一种方法可以即时更改接收者应用 ID:https://developers.google.com/android/reference/com/google/android/gms/cast/framework/CastContext#public-void-setreceiverapplicationid-string-applicationid

不幸的是,我在 iOS SDK 中没有看到类似的东西 :(

我唯一找到的是这个(在 GCKSessionManager 中):

/**
 * Sets the default session options for the given device category.The session options are passed to
 * the GCKDeviceProvider::createSessionForDevice:sessionID:sessionOptions: method when the user
 * selects a device from the Cast dialog.  For Cast sessions, the session options can specify which
 * receiver application to launch.
 *
 * @param sessionOptions The session options. May be <code>nil</code> to remove any previously set
 * options.
 * @param category The device category.
 *
 * @since 4.0
 */
- (void)setDefaultSessionOptions:(nullable GCKSessionOptions *)sessionOptions
               forDeviceCategory:(NSString *)category;

但是没有关于要传递哪个 sessionOptions 和类别的文档(类别可能是 kGCKCastDeviceCategory)。无法理解存在哪些参数以及如何构造它们。

【问题讨论】:

  • 你最终解决了这个问题吗?
  • @natus 不,我还没有解决它(
  • 认为这是不可能的,因为没有管理 Google Cast SDK 内部单例实例的方法,并且一旦使用 setSharedInstanceWith 初始化,您就无法更改其选项。
  • @iUrii 好吧,我特地问了这个问题来寻找答案。我相信这是可能的,也许是以一种骇人听闻的方式或作为一种解决方法。也许在setDefaultSessionOptions 中指定所需的参数。我写信给 Google 开发人员支持,在 Github 和他们的 IssueTracker 上创建了问题。到目前为止还没有收到任何答案,但是这个用例很重要。 issuetracker.google.com/issues/175803965

标签: ios swift xcode chromecast google-cast


【解决方案1】:

经过一段时间的逆向工程,我找到了解决方案。它需要两个必要的步骤:

第 1 步:使用私有 Objective-C 调用初始化 GCKDiscoveryCriteria

let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID)
let initWithIds = Selector(("initWithApplicationIDs:"))
if criteria.responds(to: initWithIds) {
    criteria.perform(initWithIds, with: NSOrderedSet(array: [kGCKDefaultMediaReceiverApplicationID, kReceiverAppID]))
}
    
let options = GCKCastOptions(discoveryCriteria: criteria)
GCKCastContext.setSharedInstanceWith(options)

在这里,您需要提供一个 NSOrderedSet 实例以及您要使用的应用程序 ID。在我的例子中,其中一个是默认的媒体接收器应用程序 ID,第二个是自定义的。

第 2 步:动态设置用于新创建会话的应用 ID。您可以在应用生命周期内多次调用它:

let sessionManager = GCKCastContext.sharedInstance().sessionManager
sessionManager.setDefaultSessionOptions(["gck_applicationID": NSString("YOUR_RECEIVER_APP_ID")],
                                                                                forDeviceCategory: kGCKCastDeviceCategory)
    

这里我们使用字符串gck_applicationID 作为键。找了好几天终于找到了!!!您可以使用 kGCKDefaultMediaReceiverApplicationID 作为值,或您的自定义接收器应用 ID。

感谢@iUrii 和他对逆向工程的指导。 https://stackoverflow.com/a/65408060/5147552

P.S.:我使用私有方法来完成我想要的。它适用于google-cast-sdk-no-bluetooth,版本 4.5.3。但它可能会发生变化。使用时要小心,因为新版本的 SDK 可能会破坏它。

【讨论】:

    【解决方案2】:

    您可以通过调用 private objc unsetSharedInstance 选择器来删除 Cast 的单例实例,然后重新设置:

    let unset = Selector("unsetSharedInstance")
    if GCKCastContext.responds(to: unset) {
        GCKCastContext.perform(unset)
    }
    GCKCastContext.setSharedInstanceWith(GCKCastOptions(discoveryCriteria: GCKDiscoveryCriteria(applicationID: "APP_ID")))
    

    您可以将其用作临时解决方案,因为它可以在库的新版本中进行更改。

    【讨论】:

    • 感谢您的回答。我尝试过这个。代码确实被执行,但它不会更改 applicationId。它启动在application: didFinishLaunching 中设置的那个。 :( 顺便问一下,你是怎么找到这种方法的?
    • @AleksandrHoncharov 我找到了新方法,请尝试一下
    • 它设置了新实例,但不幸的是它崩溃了。 Thread 1: "+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'GCKDBDeviceInfo'"。更改会话选项的第一个变体更改了上下文中的值。因此,它起作用了,但没有达到所需的结果。完成后重新启动会话管理器或其他东西可能很重要。
    • 我认为你应该在删除实例后停止并重新初始化。
    • 是的,我试过了。但它似乎不起作用,因为它在做一些我无法控制的事情。
    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2020-01-05
    • 2019-10-22
    相关资源
    最近更新 更多