2015-05-25 13 views
6

Cercando di capire come leggere i pulsanti del volume della cuffia Apple da utilizzare come trigger per l'otturatore della fotocamera (come fa l'app Apple Camera).Evento di controllo remoto in iOS con Swift

Dalla documentazione sulla Remote Control Events, Remote Control Received With Event e this git repo, ho messo insieme che io probabilmente bisogno di un oggetto AVAudioPlayer, .beginReceivingRemoteControlEvents(), e remoteControlReceivedWithEvent, insieme a fare questo punto di vista canBecomeFirstResponder()return true.

import UIKit 
import AVFoundation 

class ViewController: UIViewController, AVAudioPlayerDelegate { 
    var player: AVAudioPlayer! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var session: AVAudioSession = AVAudioSession.sharedInstance() 
     session.setActive(true, error: nil) 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     println("viewDidAppear worked...") 
     self.becomeFirstResponder() 
     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
    } 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    override func remoteControlReceivedWithEvent(event: UIEvent) { 
     let rc = event.subtype 
     println("does this work? \(rc.rawValue)") 
     //takePicture() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

mi aspettavo di ottenere "does this work" quando colpisce i pulsanti del volume sulle cuffie, invece ho appena vedo regolare il volume delle cuffie come normale. Quindi mi manca qualcosa, forse con un delegate o AVSession?

risposta

3

Ho effettuato il cross-post su r/swift, dove mi è stato detto che probabilmente richiede la riproduzione audio (citata direttamente dalla documentazione).

Quindi, anche se questa non è la soluzione ideale, funziona per mio uso privato.

import UIKit 
import AVFoundation 
import MediaPlayer 

class ViewController: UIViewController, AVAudioPlayerDelegate { 
    var testPlayer: AVAudioPlayer? = nil 

    func loadSound(filename: NSString) -> AVAudioPlayer { 
     let url = NSBundle.mainBundle().URLForResource(filename as String, withExtension: "caf") 
     var error: NSError? = nil 
     let player = AVAudioPlayer(contentsOfURL: url, error: &error) 
     if error != nil { 
      println("Error loading \(url): \(error?.localizedDescription)") 
     } else { 
      player.prepareToPlay() 
     } 
     return player 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.testPlayer = self.loadSound("silence") 
     self.testPlayer?.numberOfLoops = -1 
     self.testPlayer?.play() 
    } 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     self.becomeFirstResponder() 
     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
    } 

    override func remoteControlReceivedWithEvent(event: UIEvent) { 
     let rc = event.subtype 
     println("rc.rawValue: \(rc.rawValue)") 
     // take photo 
    } 
} 

Ho notato che in applicazione fotocamera di Apple, i pulsanti +/- del volume innescare la macchina fotografica, e le pause pulsante del microfono/svolge ogni esecuzione audio in un altro app, ma in questa implementazione i tasti del volume ancora controllano il volume (e qualsiasi audio è stato messo in pausa all'avvio dell'app).

Un rc.rawValue: 103 corrisponde ad un singolo clic del pulsante del microfono, un doppio clic ritorna 104, e una tripla click torna 105, e poi a volte urtare una coppia alla volta restituisce un 108 o 109.

+0

Questo funziona per me (con leggera modifica per Swift 3) in privato. Qualcuno sa se l'uso di questo tipo sarà accettato per l'App Store? – triiiiista