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 NSNotification
gepostet 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 istEinfach 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 FragenDiese 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.