Skip to main content
 首页 » 操作系统

ios之如何正确连接到 Google Cast 设备并使用自定义接收器转换 url

2024年01月01日54落叶无声

为了创建这个,我使用了 Github 上的 Google Cast 引用 https://github.com/googlecast/CastHelloText-ios & https://github.com/googlecast/CastVideos-ios

然后,如果您下载了它,请查看我与 Google Cast 相关的代码块。如果您看到导致此错误发生的原因,请告诉我。因为老实说,我不知道这是 Xcode 错误还是 Google Cast 错误.. 或者是最常见的错误.. 人类

启动模拟器,它将在网络中寻找事件的 Chrome Cast 设备。如果找到,将出现转换按钮。当您按下转换按钮时,它会转到 chooseDevice() 函数,并会向您的网络中的设备显示一个 UIAlertController,然后您可以选择要转换到的设备。

如果您点击一个设备,它将转到 connectToDevice() 函数并建立连接。

连接后,它应该转到下一个名为“deviceManagerDidConnect”的函数。所以我收到一条消息“已连接”。5 秒后我收到一条错误消息“Error Domain=com.google.GCKError Code=2。网络连接超时”。当我重建项目时,我得到了不同的结果.. 在“deviceManagerDidConnect”之后,它现在将进入“didConnectToCastApplication”功能,这不是第一次发生。这是一个错误还是我做错了什么?

我期望的是它会转到“deviceManagerDidConnect”,然后它会转到“didConnectToCastApplication”函数。之后所有的工作我想投一个 WKWebView ..我知道(还)不支持。所以我想转换我在文本字段中提供的 URL。

您使用的是什么版本的产品?在什么操作系统上?
GoogleCastSDK-2.5.1-发布,OS X Yosemite 10.10.1 Xcode 版本 6.1.1 (6A2008a)

提前致谢,祝您有美好的一天,

好

下面你可以找到我的代码..

    // ==================== Google Cast ==================== 
    // ==================== chooseDevice() ==================== 
func chooseDevice() { 
    if selectedDevice == nil { 
        let alertController = UIAlertController(title: "Choose device..", message: "", preferredStyle: .ActionSheet) 
 
        for device in deviceScanner.devices { 
            alertController.addAction(UIAlertAction(title: device.friendlyName, style: .Default, handler: { alertAction in 
                self.selectedDevice = device as GCKDevice 
                self.connectToDevice() 
            })) 
        } 
 
        let addCancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: { alertAction in 
            alertController.dismissViewControllerAnimated(true, completion: nil) 
        }) 
 
        // Add action to the controller 
        alertController.addAction(addCancelAction) 
 
        // Finaly present the action controller 
        presentViewController(alertController, animated: true, completion: nil) 
    } 
    else { 
        updateButtonStates() 
 
        let mediaTitle = self.mediaInformation?.metadata.stringForKey(kGCKMetadataKeyTitle) 
        //            mediaTitle.metadata.stringForKey(kGCKMetadataKeyTitle) //Silver Essence Castaway 
        //            var mediaTitle = mediaInformation.metadata.stringForKey(kGCKMetadataKeyTitle) 
 
        NSLog("De waarde van kGCKMetadataKeyTitle is: \(kGCKMetadataKeyTitle)") 
 
        let alertController = UIAlertController(title: "Casting to: \(selectedDevice.friendlyName)", message: nil, preferredStyle: .ActionSheet) 
 
        let addDisconnectingAction = UIAlertAction(title: "Disconnect device", style: .Destructive, handler: { alertAction in 
                            println("De waarde van mediaInformation is: \(mediaTitle)") 
                            if mediaTitle != nil { 
                                (mediaTitle != nil ? 1 : 0) 
                                alertController.dismissViewControllerAnimated(true, completion: nil) 
                                println("the else UIAlertController") 
                            } 
        }) 
 
        let addCancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: { alertAction in 
                            println("De waarde van mediaInformation is: \(mediaTitle)") 
                            if mediaTitle != nil { 
                                (mediaTitle != nil ? 2 : 1) 
                                alertController.dismissViewControllerAnimated(true, completion: nil) 
                                println("else uiactionsheet") 
                            } 
        }) 
 
        // Add action to the controller 
        alertController.addAction(addDisconnectingAction) 
        alertController.addAction(addCancelAction) 
 
        // Finaly present the action controller 
        self.presentViewController(alertController, animated: true, completion: nil) 
    } 
} 
 
    // ==================== updateStatsFromDevice() ==================== 
func updateStatsFromDevice() { 
    if mediaControlChannel != nil { 
        mediaInformation = mediaControlChannel.mediaStatus.mediaInformation 
    } 
} 
 
    // ==================== isConnected() ==================== 
func isConnected() -> Bool { 
    return deviceManager.isConnected 
} 
 
    // ==================== connectToDevice() ==================== 
func connectToDevice() { 
    if selectedDevice != nil { 
        //            var info = NSBundle.mainBundle().infoDictionary!["CFBundleIdentifier"] as? NSString 
        //            deviceManager = GCKDeviceManager(device: selectedDevice, clientPackageName: info) 
        deviceManager = GCKDeviceManager(device: selectedDevice, clientPackageName: "CFBundleIdentifier") 
 
 
        //            NSLog("de waarde van info is \(info)") 
        NSLog("de waarde van selectedDevice is \(selectedDevice)") 
 
        deviceManager.delegate = self 
        deviceManager.connect() 
    } 
} 
 
    // ==================== deviceDisconnected() ==================== 
func deviceDisconnected() { 
    NSLog("Device disconneted: \(selectedDevice.friendlyName)") 
    deviceManager = nil 
    selectedDevice = nil 
    mediaControlChannel = nil 
    textChannel = nil 
} 
 
    // ==================== updateButtonStates() ==================== 
func updateButtonStates() { 
    if (deviceScanner.devices.count == 0) { 
        // Hide the cast button 
        chromecastButton.setImage(btnImage, forState: .Normal) 
        chromecastButton.hidden = true 
    } 
    if (deviceScanner.devices.count > 0) { 
 
        chromecastButton.setImage(btnImage, forState: .Normal) 
        chromecastButton.hidden = false 
 
        // Show cast button 
        if (deviceManager != nil) { 
            chromecastButton.setImage(btnImageSelected, forState: .Normal) 
            chromecastButton.hidden = false 
        } 
    } 
} 
 
    // ==================== sendText ==================== 
@IBAction func sendText(sender: AnyObject) { 
    NSLog("Cast video") 
 
    if deviceManager == nil { 
        var alert = UIAlertController(title: "Not connected", message: "Please connect to Cast device", preferredStyle: UIAlertControllerStyle.Alert) 
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
        presentViewController(alert, animated: true, completion: nil) 
 
        return 
    } 
 
    // Define media metadata 
    var metaData = GCKMediaMetadata(metadataType: GCKMediaMetadataType.User) 
    metaData.objectForKey("CFBundleVersion") 
 
    metaData.setString("Bug Bunny!", forKey: kGCKMetadataKeyTitle) 
    metaData.setString("dit is allemaal maar was subtitles", forKey: kGCKMetadataKeySubtitle) 
    var url = NSURL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg") 
    metaData.addImage(GCKImage(URL: url, width: 480, height: 360)) 
 
    //        var mediaInformation = GCKMediaInformation(contentID: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", streamType: .None, contentType: "video/mp4", metadata: metaData as GCKMediaMetadata, streamDuration: 0, customData: nil) 
    mediaInformation = GCKMediaInformation(contentID: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", streamType: GCKMediaStreamType.None, contentType: "video/mp4", metadata: metaData, streamDuration: 0, customData: nil) 
 
 
    NSLog("waarde van mediainformation is : \(mediaInformation)") 
 
    self.mediaControlChannel?.loadMedia(mediaInformation, autoplay: true, playPosition: 0) 
    //        textChannel.sendTextMessage(textFieldUrl.text) 
} 
 
    // MARK: GCKDeviceScannerListener 
    // ==================== deviceDidComeOnline() ==================== 
func deviceDidComeOnline(device: GCKDevice!) { 
    NSLog("device found! \(device.friendlyName)") 
    updateButtonStates() 
} 
 
    // ==================== deviceDidGoOffline() ==================== 
func deviceDidGoOffline(device: GCKDevice!) { 
    NSLog("device did go offline \(device.friendlyName)") 
    updateButtonStates() 
} 
 
    // MARK: UIActionSheetDelegate 
    // ==================== actionSheet() ==================== 
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) { 
    if selectedDevice == nil { 
        if buttonIndex < deviceScanner.devices.count { 
            selectedDevice = deviceScanner.devices[buttonIndex] as GCKDevice 
            NSLog("Selecting device: \(selectedDevice.friendlyName)") 
            connectToDevice() 
        } 
    } 
    else { 
        if buttonIndex == 1 { 
            NSLog("Disconnecting device: \(selectedDevice.friendlyName)") 
            deviceManager.leaveApplication() 
            deviceManager.disconnect() 
            deviceDisconnected() 
            updateButtonStates() 
        } 
        else if buttonIndex == 0 { 
            // Join the existing session 
        } 
    } 
} 
 
    // MARK: GCKDeviceManagerDelegate 
    // ==================== deviceManagerDidConnect() ==================== 
func deviceManagerDidConnect(deviceManager: GCKDeviceManager!) { 
    NSLog("Connected!") 
    updateButtonStates() 
    self.deviceManager.launchApplication(kReceiverAppID) 
} 
 
    // ==================== didConnectToCastApplication() ==================== 
func deviceManager(deviceManager: GCKDeviceManager!, didConnectToCastApplication applicationMetadata: GCKApplicationMetadata!, sessionID: String!, launchedApplication: Bool) { 
    NSLog("application has launched") 
 
 
    // textChannel = HTCGTextChannel(namespace: "urn:x-cast:com.silver.essence.Silver") 
    // self.deviceManager.addChannel(textChannel) 
 
 
    mediaControlChannel = GCKMediaControlChannel() 
    mediaControlChannel.delegate = self 
    self.deviceManager.addChannel(mediaControlChannel) 
    mediaControlChannel.requestStatus() 
} 
 
    // ==================== didFailToConnectToApplicationWithError() ==================== 
func deviceManager(deviceManager: GCKDeviceManager!, didFailToConnectToApplicationWithError error: NSError!) { 
    showError(error) 
 
    deviceDisconnected() 
    updateButtonStates() 
} 
 
    // ==================== didFailToConnectWithError() ==================== 
func deviceManager(deviceManager: GCKDeviceManager!, didFailToConnectWithError error: NSError!) { 
    showError(error) 
 
    deviceDisconnected() 
    updateButtonStates() 
} 
 
    // ==================== didDisconnectWithError() ==================== 
func deviceManager(deviceManager: GCKDeviceManager!, didDisconnectWithError error: NSError!) { 
    NSLog("Received notification that device disconnected") 
 
    if error != nil { 
        showError(error) 
    } 
 
    deviceDisconnected() 
    updateButtonStates() 
} 
 
    // ==================== didReceiveApplicationMetadata() ==================== 
func deviceManager(deviceManager: GCKDeviceManager!, didReceiveApplicationMetadata metadata: GCKApplicationMetadata!) { 
    applicationMetadata = metadata 
} 
 
    // ==================== showError() ==================== 
func showError(error: NSError) { 
    var alert = UIAlertController(title: "Something went wrong", message: error.description, preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
    presentViewController(alert, animated: true, completion: nil) 
} 
 
    // ==================== viewDidLoad() ==================== 
override func viewDidLoad() { 
    super.viewDidLoad() 
    self.loadNSUserDefaults() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "saveNSUserDefaults", name: "kSaveSwitchesStatesNotification", object: nil); 
    navigationItem.title = "Settings" 
 
    // ==================== Adding the Chromecast button ==================== 
    //        kReceiverAppID = kGCKMediaDefaultReceiverApplicationID 
 
    NSLog("de waarde van kReceiverAppID in viewDidLoad() is : \(kReceiverAppID)") 
 
    btnImage = UIImage(named: "icon-cast-identified") 
    btnImageSelected = UIImage(named: "icon-cast-connected") 
 
    chromecastButton = UIButton() 
    chromecastButton.setImage(UIImage(named: "icon-cast-identified"), forState: .Normal) 
    chromecastButton.frame = CGRectMake(0, 0, 45, 45) 
    chromecastButton.addTarget(self, action: "chooseDevice", forControlEvents: .TouchUpInside) 
    chromecastButton.hidden = true 
 
    var rightItem:UIBarButtonItem = UIBarButtonItem() 
    rightItem.customView = chromecastButton 
    self.navigationItem.leftBarButtonItem = rightItem 
 
    // ==================== Scan for Chromecast devices ==================== 
    deviceScanner = GCKDeviceScanner() 
    filterCriteria = GCKFilterCriteria(forAvailableApplicationWithID: kReceiverAppID) 
    deviceScanner.filterCriteria = filterCriteria 
    deviceScanner.addListener(self) 
    deviceScanner.startScan() 
} 

请您参考如下方法:

终于找到问题了!它在接收器中。当您连接到网络中的转换设备时,接收器正在加载的 HTML 文件。确保您的 HTML 文件具有连接回应用程序的正确功能。 希望这会帮助遇到同样问题并且数周不考虑解决方案的人..

如果您不知道需要哪些功能,请查看 Google 提供给我们的示例。 https://github.com/googlecast/