2016-08-04 32 views
6

Ich sah Menschen verwenden: [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; Fernbedienung Ereignis bei der Verwaltung von Audio-Session zu behandeln.Verwendung von beginReceivingRemoteControlEvents

Meine Frage:

diesen Code funktioniert nur entweder in einer UIViewController Klasse oder AppDelegate Klasse verwendet werden? Weil ich jeden im Internet sehe, der es in einer der zwei Klassen benutzt. Kann ich es in einer Klasse verwenden, die keine Unterklasse von UIViewController oder AppDelegate ist?

Antwort

4

Für Anwendungen, die nur Remote Control-Ereignisse in einem bestimmten Zustand behandeln möchten - z. B. zur Wiedergabe von Medien im Gegensatz zu den Einstellungen oder dem Registrierungsbildschirm - ruft ein View Controller beginReceivingRemoteControlEvents auf Menge an Sinn. Andere Apps möchten möglicherweise das Fernsteuerungsverhalten vollständig unterdrücken (da sie die Audiositzung übernehmen und nicht möchten, dass Hintergrundaudio vom Benutzer ausgelöst wird und Sitzungsdaten beschädigt werden).

Es gibt jedoch nichts, was Sie daran hindert, dieses Verhalten in einen anderen Bereich der App zu übernehmen, insbesondere wenn es geteilt wird. beginReceivingRemoteControlEvents ist eine Methode auf UIApplication, so lange, wie Sie in der Lage sind, ein Handle zu [UIApplication sharedApplication] zu bekommen, können Sie die App zu Beginn/Ende der Fernbedienung Ereignisbehandlung zu kennzeichnen.

Allerdings ist es erwähnenswert, dass Methode ist veraltet:

In iOS 7.1 und höher das gemeinsame MPRemoteCommandCenter Objekt für Fernsteuerungsereignisse registrieren. Sie müssen diese Methode nicht aufrufen, wenn Sie das geteilte Command-Center-Objekt verwenden. [1]

Meine Erfahrung mit Fernbedienung Ereignisbehandlung ist ein paar Jahre alt an diesem Punkt, aber ich erinnere mich, dass ein nicht-intuitives Verhalten mit beginReceivingRemoteControlEvents Umgang war. Ein kurzer Blick auf MPRemoteCommandCenter macht dies wie eine bessere API für die Handhabung von Remote Control-Ereignissen aussehen. Wenn Ihre Anwendungsfälle keine Unterstützung für iOS 7.0 erfordern, sollten Sie diese API untersuchen.

+0

Haben Sie einen Beispielcode mit MPRemoteCommandCenter? Danke –

+1

@JaredChu Sorry, ich habe keine direkte Erfahrung damit. – Palpatim

0

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; kann an jedem Punkt in Ihrer Anwendung verwendet werden, z. B. direkt vor dem Starten der Audiowiedergabe oder beim Start in application:didFinishLaunchingWithOptions: Delegate-Methode.

Für Anwendungen, die die Steuerelemente für Hintergrund-Audiowiedergabe über den gesamten Anwendungslebenszyklus (und im Hintergrund) verwenden möchten, würde ich empfehlen, beginReceivingRemoteControlEvents in Ihrem AppDelegate aufzurufen. Auf diese Weise können Sie jederzeit während des Anwendungslebenszyklus Remoteüberwachungsereignisse empfangen.

Palpatim erwähnt MPRemoteCommandCenter. Als jemand, der eine komplette Anwendung rund um die Hintergrund-Audiowiedergabe (think radio) aufgebaut hat, würde ich diese Methode gegenüber den alten UIEvent Callbacks wärmstens empfehlen. Ich tauche in diesem Ansatz in another answer, aber das Wesentliche ist MPRemoteCommandCenter.sharedCommandCenter() verwenden, um Steuerelemente für die Wiedergabe auf dem Sperrbildschirm und Leitzentrale, sowie bieten Selektoren zu aktivieren oder deaktivieren:

let commandCenter = MPRemoteCommandCenter.sharedCommandCenter() 

commandCenter.previousTrackCommand.enabled = true; 
commandCenter.previousTrackCommand.addTarget(self, action: #selector(previousTrack)) 

commandCenter.nextTrackCommand.enabled = false 
commandCenter.nextTrackCommand.addTarget(self, action: #selector(nextTrack)) 

Beachten Sie, wenn Sie explizit wollen Kontrollen deaktivieren , müssen Sie zusätzlich zur Einstellung enabled = false für den Befehl einen [Dummy] -Wähler für die Aktion bereitstellen.

Um Ihre Punkt über becomeFirstResponder Adresse:

Jedes Objekt, das von UIResponder, wie ein UIViewController oder UIApplicationDelegate kann sich die First Responder, so lange erbt wie das Objekt die gewünschte Methode implementiert remoteControlReceivedWithEvent: die Fernbedienung zu handhaben Veranstaltungen. Zum Beispiel könnte ich das AppDelegate zum ersten Responder machen und alle Fernsteuerungsereignisse dort verarbeiten und Benachrichtigungen senden, die eine UIViewController hören, um den Player anzuhalten oder zum nächsten Track zu springen. Sie könnten eine UIViewController werden die erste Antwort (der Controller mit einem Verweis auf den Spieler) und steuern Sie den Player direkt. Die Architektur ist ziemlich offen und es hängt wirklich davon ab, wie Sie Ihre Anwendung strukturiert haben. Sie haben keinen Code angegeben, daher weiß ich nicht, wie Ihr Player-Setup aussieht.

Ihre UIResponder Handling Code wird wahrscheinlich so etwas wie folgt aussehen:

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 
    if (event.type == UIEventTypeRemoteControl) { 
     switch (event.subtype) { 
      case UIEventSubtypeRemoteControlTogglePlayPause: 
       // Pause or play action 
       break; 
      case UIEventSubtypeRemoteControlNextTrack: 
       // Next track action 
       break; 
      case UIEventSubtypeRemoteControlPreviousTrack: 
       // Previous track action 
       break; 
      case UIEventSubtypeRemoteControlStop: 
       // Stop action 
       break; 
      default: 
       // catch all action 
       break; 
     } 
    } 
} 

Auch hier, ob Sie diese in einem Controller platzieren oder in Ihrem AppDelegate bis zu Ihnen ist.

Kann ich es in einer Klasse verwenden, die keine Unterklasse von UIViewController oder AppDelegate ist?

Ja, Sie implementieren dies in jeder Klasse, die von UIResponder erbt. Menschen verwenden normalerweise den AppDelegate oder einen View-Controller zur Vereinfachung.

+0

Danke, aber die Leute sagen, ich muss '[self fastFirstResponder]' so nennen: http://stackoverflow.com/questions/17325438/ios-handle-remote-control-events-and-hen-relay-the-events -zu-Musik-Apps, die anzeigen, dass es nur in der Unterklasse von UIResponder verwendet werden kann. Deshalb stelle ich diese Frage, ich möchte sie in einer Klasse verwenden, die nicht UI oder UIResponder verwandt ist. –

+0

@ Leem.fin Die Klasse, die 'remoteControlReceivedWithEvent implementiert:' sollte 'findFirstResponder' aufrufen. Ich werde meine Antwort bearbeiten. Beachten Sie auch, dass AppDelegate eine Unterklasse von UIResponder ist. – JAL