简体   繁体   中英

Connecting/disconnecting to/from an Chromecast Device with Swift

I recently started to develop and Chromecast application with Apple new language Swift. But I'm stuck at making an connection with the Chromecast device. What it does so far that It can see an Chromecast on the network. 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. At first I thought it would be the ActionSheet thats making it not work. 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

-- UPDATE --

After the Alertcontroller popup I click an device it's then connecting and succeeds. When I'm trying to disconnect it's giving me an exception error " unexpectedly found nil while unwrapping an Optional value ". I'm getting this error on this line of code.

self.mediaInformation.metadata.stringForKey(kGCKMetadataKeyTitle)

So basically it's saying the 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. It could be something wrong in connectToDevice() or in deviceManagerDidConnect() ? The weard thing is that I never get the message "Connected" in 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

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:
Declaration:

var mediaInformation : GCKMediaInformation?

Usage:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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