Domanda

Al momento sto cercando di impostare l'audio di sfondo per un app sto sviluppando per iOS 4. L'applicazione non dispone di un lettore musicale viewController dedicato, però, a differenza di altri audio di sottofondo applicazioni come Pandora, che rende il compito un po 'più di confusione.

Ho impostato le impostazioni appropriate Info.plist correttamente e avere un oggetto AVAudioPlayer nella mia app delegato che è accessibile da tutto il mondo. Quando l'utente suona una canzone, si sostituisce la AVAudioPlayer con uno nuovo inizializzato con il brano e riprodurlo. Tutto questo funziona bene, solo che adesso non ho idea di come fare per sostenere gli eventi di controllo remoto.

Sulla base della documentazione di Apple, ho questo:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    switch(event.subtype) {
        case UIEventSubtypeRemoteControlTogglePlayPause:
            if([iPhoneAppDelegate backgroundAudioPlayer].playing)
                [iPhoneAppDelegate pauseBackgroundAudioPlayer];
            else
                [iPhoneAppDelegate playBackgroundAudioPlayer];
            break;
    }
}

La cosa è, dove posso mettere questo? la documentazione di Apple sembra suggerire questo dovrebbe andare in qualche vista del regolatore da qualche parte, ma la mia app ha un sacco di vista controller e controller di navigazione. Ovunque io cerco di mettere questo, per qualche ragione, toccando il pulsante Toggle Play / Pausa nei multitasking vassoio telecomandi o fa sì che il brano di appena pausa per un attimo e poi Ripresa, o in qualche modo fa sì che il brano da riprodurre due volte.

È stato utile?

Soluzione 2

Ho trovato un paio di soluzioni per la ricezione di eventi telecomando globale sulla Apple Developer Forum, dopo un po 'di ricerca.

Un modo è quello di sottoclasse UIWindow e override sua remoteControlReceivedWithEvent:.

Il secondo modo, forse più bello è quello di sottoclasse UIApplication e di override sendEvent:. In questo modo, è possibile intercettare tutti gli eventi di controllo remoto e gestirli lì a livello globale, e non hanno altre soccorritori li gestiscono più avanti nella catena responder.

- (void)sendEvent:(UIEvent *)event {
     if (event.type == UIEventTypeRemoteControl) {
          // Handle event
     }
     else
          [super sendEvent:event];
}

Altri suggerimenti

Gli esempi di documentazione sono un po 'fuorviante, ma non v'è alcuna necessità di sottoclasse nulla da nessuna parte. Il posto giusto per mettere remoteControlReceivedWithEvent: è il delegato applicazione, in quanto rimane nella catena risponditore indipendentemente dal fatto che l'applicazione è in primo piano oppure no. Anche l'inizio / fine di ricevere gli eventi di controllo remoto deve essere basata su se hai veramente bisogno gli eventi, non sulla visibilità di alcuni vista casuale.

Il secondo metodo non ha funzionato per me, sendEvent non è mai stato chiamato. Tuttavia, il primo metodo funzionava bene (sottoclasse UIWindow).

Ho lottato con questo per un po 'e nessuna delle risposte precedenti funzionato. Il bug nel mio codice, e spero che possa aiutare qualcuno leggendo questo, era che avevo il set AudioSession di mescolare con gli altri. Vuoi essere il lettore audio in primo piano per ottenere gli eventi di controllo remoto. Verificare se si dispone di codice errato in questo modo:

    [[AVAudioSession sharedInstance] setDelegate: self];
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    UInt32 doSetProperty = 0;
    AudioSessionSetProperty (
                             kAudioSessionProperty_OverrideCategoryMixWithOthers,
                             sizeof (doSetProperty),
                             &doSetProperty
                             );
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];       

E rimuovere l'AudioSessionSetProperty, o cambiare doSetProperty a 1.

Non c'è bisogno di Window sottoclasse o gli eventi in avanti. Semplicemente gestirlo dal controller della vista principale. Vedere l'esempio Audio Mixer (MixerHost) per i dettagli.

http://developer.apple.com/LIBRARY /IOS/#samplecode/MixerHost/Listings/Classes_MixerHostViewController_m.html

Una cosa che sembra influenzare questo comportamento è eventuali opzioni di categoria impostate per il vostro AVAudioSession utilizzando setCategory: withOptions: errore: invece di setCategory: errore :. In particolare, da tentativi ed errori, sembra che se si imposta AVAudioSessionCategoryOptionMixWithOthers non sarà possibile ottenere gli eventi di controllo remoto; i controlli ora giocano sarà ancora controllare l'applicazione iPod. Se si imposta AVAudioSessionCategoryOptionDuckOthers otterrete gli eventi di controllo remoto, ma sembra che ci può essere qualche ambiguità circa quale app è controllata. Impostazione dei categoryOptions a 0 o semplicemente chiamando setCategory: errore:. Funziona meglio

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top