2015-05-25 23 views
6

Versuchen Sie herauszufinden, wie die Lautstärketasten des Apple-Kopfhörers zu lesen sind, um sie als Trigger für den Kameraverschluss zu verwenden (wie es bei der Apple Camera App der Fall ist).Fernbedienungsereignis in iOS mit Swift

Aus der Dokumentation auf Remote Control Events, Remote Control Received With Event und this git repo, ich habe zusammen genäht, dass ich wahrscheinlich ein AVAudioPlayer Objekt, .beginReceivingRemoteControlEvents() und remoteControlReceivedWithEvent, zusammen mit der Herstellung dieser Ansicht canBecomeFirstResponder()return true müssen.

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() 
    } 
} 

Ich erwartete "does this work" zu erhalten, wenn auf dem Kopfhörer die Lautstärketasten schlagen, stattdessen sehe ich nur die Kopfhörerlautstärke wie normale einzustellen. Also muss ich etwas vermissen, vielleicht mit einer delegate oder AVSession?

Antwort

3

Ich cross-postete dies auf r/swift, wo mir gesagt wurde, dass es wahrscheinlich erfordert, Audio zu spielen (zitiert direkt aus der Dokumentation).

Obwohl dies nicht die ideale Lösung ist, funktioniert es für meinen eigenen privaten Gebrauch.

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 
    } 
} 

Ich bemerkte, dass in Apples Kamera-App, die +/- Lautstärketasten die Kamera auslösen, und die Mikrofontaste pausiert/spielt alle Audio-Betrieb in einer anderen Anwendung, aber in dieser Implementierung die Lautstärke-Tasten steuern immer noch die Lautstärke (und alle Audiodateien wurden angehalten, als die App gestartet wurde).

Ein rc.rawValue: 103 mit einem einzigen Klick auf die Mikrofontaste entspricht, ein Doppelklick kehrt 104, und ein dreifacher Klick kehrt 105, und dann manchmal ein paar zu einer Zeit, stoßen eine 108 oder 109 zurückgibt.

+0

Dies funktioniert für mich (mit kleinen Änderungen für Swift 3) privat. Weiß jemand, ob eine solche Nutzung für den App Store akzeptiert wird? – triiiiista