Erkennen Sie eine Änderung der Ring- / Lautlos-Schalterposition

Ich arbeite an einer App, für die ich gerne:

Beachten Sie bei der Audiowiedergabe den Ring / Silent-Schalter und

Zeigen Sie ein Symbol an, das darauf hinweist, dass der Ton stummgeschaltet ist, wenn der Ring / Silent-Schalter auf Silent gestellt ist.

Anforderung 1 ist einfach: Ich benutzeAVAudioSessionSoloAmbient als Audiositzungskategorie meiner App, sodass sich meine Audiositzung von selbst stummschaltet, wenn der Ring- / Stummschalter ausgeschaltet ist.

Anforderung 2 scheint erheblich schwieriger zu sein, da ich eine Art Rückruf, Benachrichtigung oder KVO benötige, die es mir ermöglicht, die Position des Switches zu überwachen. Apple hat jedoch klargestellt, dass es nicht gewillt ist, eine offiziell bekannte Methode dafür anzubieten. Das heißt, wenn ich einen nicht störenden Weg finde, um die Position des Schalters zu überwachen, auch einen, der technisch verboten ist (wie zum Beispiel einen internen)NSNotification), Ich wäre bereit, es von Apple auszuführen.

Außerdem würde ich es vorziehen, einige der Abfragelösungen, die ich an anderer Stelle gefunden habe, nicht zu implementieren. Ein Beispiel finden Sie im Abschnitt Verwandte Fragen.

Was ich gelernt habe (auch bekannt als Was nicht funktioniert)

Zumindest in den iOS-Versionen 4 und 5 gab es einen Trick, mit dem die Position des Schalters ermittelt werden konnteÜberwachen der Routeneigenschaft der aktuellen Audiositzung. Abgesehen davon, dass sie von derAVAudioSession Klasse, ich kann bestätigen, dass dieser Trick keine Option mehr ist. Die aktuelle Route, die beide von den C-Funktionen gemeldet wird, die die veralteten enthaltenAudio Session API und die aktuelleAVAudioSession Klasse ändert sich nicht, wenn der Ring / Silent-Schalter umgeschaltet wird.

AVSystemController ist eine interne Klasse das scheint viel versprechend zu sein. Aufrufen- (BOOL)toggleActiveCategoryMuted auf dersharedAVSystemController schaltet in der Tat den Ton meiner App stumm. Ferner gibt der gemeinsam genutzte Singleton einenAVSystemController_SystemVolumeDidChangeNotification Benachrichtigung bei Änderung der Systemlautstärke über die Lautstärketasten. Leider wird diese Benachrichtigung nicht als Reaktion auf Änderungen am Ring / Silent-Schalter gesendet (obwohldiese zweifelhaft zugeschriebene Quelle sagt es sollte).

Soweit ich das beurteilen kann, gibt esNein NSNotificationgepostet vonirgendein Objekt bei Änderung der Position des Klingel- / Lautlosschalters. Ich bin zu diesem Schluss gekommen, nachdem ich mich als Beobachter zu allen Benachrichtigungen in der Standardzentrale hinzugefügt hatte:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:nil object:nil];

und dann den Ring / Silent-Schalter umschalten. Nichts.

DasAVSystemController Klasse hat eine vielversprechende Methode mit der Signatur:

- (BOOL)getActiveCategoryMuted:(BOOL*)arg1;

Hierbei gibt es jedoch zwei Probleme:

Weder der Rückgabewert noch derBOOL zeigte auf vonarg1 jemals als Reaktion auf das Umschalten des Ring / Silent-Schalters zu ändern scheinen.Aufgrund der Methodensignatur ist diese Methode (soweit ich weiß) kein Kandidat für KVO.

Ich vermute, dass ein Objekt ein oder mehrere andere Objekte sendetGSEventRef Wenn die Stummschaltung geändert wird, weil ich Folgendes in der Deklaration für Ereignistypen sehe:

kGSEventRingerOff = 1012,
kGSEventRingerOn = 1013,

Ich bin mir jedoch ziemlich sicher, dass ich diese Nachrichten nicht abfangen kann, und selbst wenn ich könnte, wäre das ein bisschen mehr als "ein bisschen" aufdringlich.

Warum ich glaube, dass dies möglich ist

Einfach ausgedrückt: Die Instagram-App zeigt im Wesentlichen dieses Verhalten. Wenn Sie ein Video ansehen, wird die Einstellung des Ring- / Lautlosschalters berücksichtigt, bei ausgeschaltetem Schalter wird jedoch ein Symbol angezeigt. Das Symbol verschwindet und wird sofort nach dem Bewegen des Schalters wieder angezeigt, sodass ich davon ausgehe, dass es ereignisbasiert sein muss und nicht abgerufen werden darf.

Verwandte Fragen

Diese Frage stammt aus iOS 4 und verwendet die Methoden, die ich in meinem ersten Aufzählungszeichen oben erwähnt habe.

Diese Frage ist der obigen sehr ähnlich.

Diese Frage ist (viel) aktueller und stellt Fragen zu iOS 7. Da ich jedoch bereit bin, einen minimal aufdringlichen Verstoß gegen die Private-API-Regeln zu akzeptieren, würde ich behaupten, dass dies eine andere Frage ist als meine eigene.

DieseAntworten schlägt vor, eine Abstimmungsmethode zu verwenden, die ich unbedingt vermeiden möchte.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage