简体   繁体   English

使用Swift与Chromecast设备连接/断开连接

[英]Connecting/disconnecting to/from an Chromecast Device with Swift

I recently started to develop and Chromecast application with Apple new language Swift. 我最近开始使用Apple新语言Swift开发和Chromecast应用程序。 But I'm stuck at making an connection with the Chromecast device. 但是我一直坚持与Chromecast设备建立连接。 What it does so far that It can see an Chromecast on the network. 到目前为止,它可以做什么,它可以在网络上看到Chromecast。 After that there will appear an AlertController(an AlertController is the same as an ActionSheet) The reason why I use AlertController is, because ActionSheet is deprecated by Apple. 之后,将出现一个AlertController(AlertController与ActionSheet相同)之所以使用AlertController,是因为Apple不赞成使用ActionSheet。 At first I thought it would be the ActionSheet thats making it not work. 起初,我认为这是ActionSheet使其无法正常工作的原因。 After that I've tried allot of different version of ActionController/ActionSheet, but no luck so far.. As an reference for creating this in Swift I used Google Cast Example apps what is in Objective C. https://github.com/googlecast/CastHelloText-ios 之后,我尝试分配不同版本的ActionController / ActionSheet,但到目前为止还没有运气。作为在Swift中创建此代码的参考,我使用了Google Cast示例应用,这是Objective C中的功能。https://github.com/ googlecast / CastHelloText-ios

-- UPDATE -- - 更新 -

After the Alertcontroller popup I click an device it's then connecting and succeeds. Alertcontroller弹出窗口后,我单击一个正在连接的设备并成功。 When I'm trying to disconnect it's giving me an exception error " unexpectedly found nil while unwrapping an Optional value ". 当我尝试断开连接时,它给我一个异常错误“ 在展开可选值时意外发现nil ”。 I'm getting this error on this line of code. 我在这行代码中收到此错误。

self.mediaInformation.metadata.stringForKey(kGCKMetadataKeyTitle)

So basically it's saying the mediaInformation = nil, 所以基本上说的是mediaInformation = nil,

self.mediaInformation.metadata.stringForKey(kGCKMetadataKeyTitle!)

so I thought lets make it optional, but that didn't work. 所以我认为可以将其设为可选,但这没用。 Does anyone know why it's not working? 有谁知道为什么它不起作用?

func chooseDevice() {
    if selectedDevice == nil {
        let alertController = UIAlertController(title: "Choose an device..", message: "Click on your chromecast!", 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()

        var mediaTitle = GCKMediaInformation()
        mediaTitle.metadata.stringForKey(self.textFieldUrl.text)

        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: \(self.mediaInformation)")
            if self.mediaInformation != nil {
                (self.mediaInformation != 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: \(self.mediaInformation)")
            if self.mediaInformation != nil {
                (self.mediaInformation != nil ? 2 : 1)
                alertController.dismissViewControllerAnimated(true, completion: nil)
                println("else uiactionsheet")
            }
        })

        alertController.addAction(addDisconnectingAction)
        alertController.addAction(addCancelAction)

        self.presentViewController(alertController, animated: true, completion: nil)
    }
}

This is how I make an connection with the Chromecast. 这就是我与Chromecast建立连接的方式。 It could be something wrong in connectToDevice() or in deviceManagerDidConnect() ? connectToDevice()deviceManagerDidConnect()可能有问题吗? The weard thing is that I never get the message "Connected" in deviceManagerDidConnect() 令人讨厌的是,我在deviceManagerDidConnect()从未收到消息“已连接”

func connectToDevice() {
    if selectedDevice != nil {
        var info = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String
        deviceManager = GCKDeviceManager(device: selectedDevice, clientPackageName: info)

        NSLog("De waarde van info: \(info)")
        NSLog("De waarde van deviceManager in connectToDevice() is: \(deviceManager)")

        deviceManager = GCKDeviceManager(device: deviceScanner.devices[0] as GCKDevice, clientPackageName: info)
        deviceManager.delegate = self
        deviceManager.connect()
    }
}

    func deviceManagerDidConnect(deviceManager: GCKDeviceManager!) {
        NSLog("Connected!")

        updateButtonStates()

        deviceManager.launchApplication(kReceiverAppID)
}

I think you need to do something in the handler for the UIAlertAction to set self.selectedDevice 我认为您需要在处理程序中执行一些操作,以使UIAlertAction设置self.selectedDevice

eg 例如

    for selectedDevice in self.deviceScanner.devices {
        alertController.addAction(UIAlertAction(title: selectedDevice.friendlyName, style: .Default, handler: { action in
            self.selectedDevice = device
            self.connectToDevice()
        }))
    }

Media title will be nil if you are not casting any media so use it in this way: 如果您不投射任何媒体,则媒体标题将为nil,请按以下方式使用它:
Declaration: 宣言:

var mediaInformation : GCKMediaInformation?

Usage: 用法:

let mediaTitle = self.mediaInformation?.metadata.stringForKey(kGCKMetadataKeyTitle)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM