Willkommen zum siebten Teil unserer Serie, in der erläutert wird, wie Sie eine 1980er-Version des iOS Phone erstellen und bauen können. App. In diesem Lernprogramm werde ich demonstrieren, wie der entsprechende Ton für jede Nummer auf der Telefontastatur abgespielt wird.
Dies ist eine Momentaufnahme dessen, was wir im Laufe dieser Serie aufbauen werden:
Dies ist eine mehrteilige Serie, die für die Vermittlung von iOS SDK-Themen entwickelt wurde. Der Inhalt wird im Verlauf der Serie immer komplexer. Wenn Sie sich irgendwann in der Folge dieser Serie verirrt fühlen, müssen Sie möglicherweise einen Schritt zurückgehen und sich durch unsere Learn Objective-C-Serie oder unsere Beginning iOS SDK Development-Serie durcharbeiten.
Im letzten Tutorial dieser Serie habe ich gezeigt, wie ein iPhone-Anruf tatsächlich eingeleitet wird, nachdem eine Nummer auf der Tastatur gewählt wurde, und wie die Nummernanzeige formatiert wird, wenn ein Benutzer auf eine Ziffer tippt. In diesem Lernprogramm fügen wir den 0 - 9 Tasten die versprochenen Berührungstöne hinzu.
Das iOS-SDK wird mit mehreren Frameworks geliefert, die verschiedene Methoden zum Abspielen von Soundclips und sogar zum Erzeugen von Audio im laufenden Betrieb bieten. Äpfel Multimedia-Programmierhandbuch beschreibt den Zweck jedes verfügbaren Audio-Frameworks wie folgt:
Eine ganze Reihe von Tutorials könnte jedem Framework in der obigen Liste gewidmet sein. Es genügt jedoch zu sagen, dass wir für dieses Tutorial das Audio Toolbox-Framework aufgrund eines einzigartigen Angebots verwenden werden: System Sound Services. System Sound Services sind ein C-Level-Interface, das für die Wiedergabe von kurzen Benutzeroberflächen-Soundeffekten und anderen kleinen Audioclips mit einer Dauer von 30 Sekunden oder weniger vorgesehen ist.
Die Wiedergabe eines Audioclips mit System Sound Services umfasst drei Schritte:
Im restlichen Teil dieses Lernprogramms wird dieser Prozess implementiert, um zuvor aufgezeichnete DTMF-Töne für die Ziffern der Zifferntastatur 0-9 abzuspielen.
Warum verwenden wir voraufgezeichnete Töne, anstatt die entsprechende Frequenz im laufenden Betrieb zu erzeugen? Im Wesentlichen, um Zeit zu sparen und dieses Lernprogramm zugänglicher zu machen, indem die für Sinusfunktionen und Frequenzgenerierung erforderliche Mathematik vermieden wird. Wenn Sie stattdessen diese Route wählen möchten, finden Sie wahrscheinlich die folgenden Artikel für Sie griffbereit:
Möchten Sie wirklich wissen, wie Sie den Ton im laufenden Betrieb erzeugen können? Wenn dieser Beitrag mindestens 10 Kommentare enthält, in denen ein Tutorial zum Erstellen von Audio von Grund auf bis zum 1. Mai 2011 angefordert wird, werde ich eine erweiterte iOS SDK-Serie zu diesem Thema erstellen. Kein Versprechen, dass es speziell DTMF-Töne geben wird, aber es wird definitiv etwas Großartiges sein.
Lassen Sie uns mit dem theoretischen Wissen aus dem Weg raus in den Code eintauchen und diese Funktion ausführen!
Zunächst müssen wir das Audio Toolbox-Framework in unsere Anwendung importieren, um die System Sound Services für unseren Code verfügbar zu machen. Wählen Sie dazu in Xcode das Projekt "PhoneAppSkin" im Bereich Project Navigator aus, wählen Sie dann unter "TARGETS" die Option "PhoneAppSkin" und anschließend die Registerkarte "Build Phases". Danach sollte Ihr Bildschirm ungefähr so aussehen:
Klicken Sie anschließend auf die Dropdown-Liste "Binär mit Bibliotheken verknüpfen" und klicken Sie auf das Symbol "+", um ein neues Framework zur Verknüpfungsphase unseres Projekts hinzuzufügen.
Finden Sie schließlich das "AudioToolbox" -Framework im Popup-Fenster und klicken Sie auf "Hinzufügen"..
Als nächstes öffnen Sie die PhoneViewController.h Datei und fügen Sie die Zeile hinzu, die erforderlich ist, um das Audio Toolbox-Framework tatsächlich in Ihre Klasse zu importieren:
#einführen#einführen
Die Audio Toolbox-Funktionen sollten jetzt für Ihre Klasse verfügbar sein!
Laden Sie den Quellcode herunter, der diesem Mobiletuts + -Pfad angehängt ist, und öffnen Sie den Ordner mit dem Titel "Audio". Ziehen Sie diesen gesamten Ordner in den Ordner "Resources" des Xcode Project Navigator. Vergewissern Sie sich, dass die Option "Kopieren" aktiviert ist, wenn Sie dazu aufgefordert werden. Sie sollten mit einem Bildschirm enden, der wie folgt aussieht:
Im PhoneViewController.h, Fügen Sie die folgende Array-Deklaration im C-Stil hinzu:
@Interface PhoneViewController: UIViewController SystemSoundID toneSSIDs [10];
Zeile 13 deklariert ein Array vom Typ C im C-Stil SystemSoundID
mit einer maximalen Kapazität von 10.
Wenn Sie System-Sound-IDs in diesem Array speichern, können Sie schnell auf den entsprechenden Soundclip im zugreifen numberButtonPressed:
Methode später.
Öffnen PhoneViewController.m und zu dem springen initWithCoder
Methode auf Zeile 17. Wenn der PhoneViewController
wird zuerst initialisiert und die initWithCoder
Wenn die Methode aufgerufen wird, möchten wir Systemtöne für jeden auf dem Tastenfeld zu verwendenden Ton mit dem iOS-System-Sound-Server registrieren. Nachdem ein Soundclip beim Soundserver registriert wurde, können wir den Server anweisen, die Sounddatei später wiederzugeben, wenn die Tastatur gedrückt wird.
Fügen Sie den folgenden Code hinzu, um die 0-9-Tastentöne zu registrieren:
-(id) initWithCoder: (NSCoder *) aDecoder self = [super initWithCoder: aDecoder]; if (self) phoneNumberString = [[NSString-Zuordnung] init]; für (int count = 0; count < 10; count++) NSString *toneFilename = [NSString stringWithFormat:@"DTMF_%02d", count]; NSURL *toneURLRef = [[NSBundle mainBundle] URLForResource:toneFilename withExtension:@"wav"]; SystemSoundID toneSSID = 0; AudioServicesCreateSystemSoundID( (CFURLRef) toneURLRef, &toneSSID ); toneSSIDs[count] = toneSSID; return self;
Auf Zeile 24, ein zum
Eine Schleife, die 10 Mal wiederholt wird, beginnt. Der Zweck davon zum
Schleife ist, um dem System eine neue System-Sound-ID hinzuzufügen toneSSIDs
Array für jeden der Tastentöne, die den Tasten 0 - 9 zugeordnet sind.
Auf Zeile 25, eine Instanz von NSString
wird instanziiert, der den Dateinamen des relevanten DTMF-Tastentons enthält. Eine interessante Anmerkung in dieser Zeile ist die stringWithFormat:
Methodenaufruf und die % 02d
Formatbezeichner. Dieser Formatbezeichner konvertiert jede Ziffer in eine mit Null aufgefüllte Ziffer, die 2 Zeichen lang ist. So wird beispielsweise 0 zu '00', 1 zu '01', 2 zu '02' usw.
Auf Zeile 27, das NSBundle
class wird verwendet, um einen Dateisystempfad zu dem Dateinamen zu generieren, der in Zeile 25 mit der Erweiterung "wav" generiert wird. NSLog
Dieser Wert, wenn Sie den vollständigen Pfad für sich selbst sehen möchten.
Zeile 29 erstellt eine Variable, in der das gespeichert werden soll SystemSoundID
Das wird als nächstes vom iOS-System-Sound-Server generiert.
Als Anmerkung,
SystemSoundID
ist nur ein typedef für den Mac-TypUInt32
, das ist selbst ein typedef fürunsigniert lang
. Folglich hätten wir die Variable in dieser Typzeile deklarieren könnenunsigniert lang
, Dies wäre jedoch eine schlechte Praxis, da zukünftige iOS-Releases das ändern könntenSystemSoundID
Typ, wodurch der Code beschädigt wird. Dennoch ist es gut, dies bei der Arbeit zu berücksichtigenSystemSoundID
s, weil der Compiler manchmal warnt, wenn er nicht kompatibel istunsigniert lang
Typen.
Zeilen 31 - 34 sind ein Funktionsaufruf im c-Stil AudioServicesCreateSystemSoundID
, was dauert ein CFURL
(Core Foundation URL) des Audiodateipfads, um eine System Sound ID und eine SystemSoundID-Referenz zu generieren, in der die SSID nach ihrer Erstellung gespeichert wird. Beachten Sie, wie das kaufmännische Und-Zeichen (d. H. '&') Vor dem Zeichen erscheint toneSSID
Variable in Zeile 33? Dies ist ein unärer Präfixoperator, der das konvertiert toneSSID
Parameter in die Speicheradresse der Variablen anstelle des im Speicher für diese Variable gespeicherten Werts. Dies geschieht damit das AudioServicesCreateSystemSoundID
Funktion kann die generierte SSID-Nummer direkt in speichern toneSSID
Speicheradresse, wodurch der Funktionsaufrufer (d. h. unsere Methode) auf die generierte SSID zugreifen kann, ohne die SSID tatsächlich von der Funktion zurückzuleiten.
Klingt etwas verwirrend? Dies wird wahrscheinlich der Fall sein, es sei denn, Sie haben bereits Erfahrung mit der Programmierung in einer Sprache wie C, C ++ oder Go. Da Objective-C eine strikte Obermenge der C-Sprache ist, ist das iOS-SDK manchmal auf in prozeduralem C geschriebene Bibliotheken angewiesen. Wenn die C-Syntax für Sie keinen Sinn ergibt, machen Sie sich jetzt keine allzu großen Sorgen Nehmen Sie es als Herausforderung, Ihr iOS-SDK-Wissen in Zukunft mit den Grundlagen der C-Sprache zu ergänzen!
Auf Zeile 35, der Index der toneSSIDs
c-artiges Array, das vom aktuellen Feld festgelegt wird Anzahl
value wird der Wert zugewiesen, den der erstellt hat AudioServicesCreateSystemSoundID
Funktion. Auf diesen SSID-Wert wird später verwiesen, um den entsprechenden Ton wiederzugeben, wenn der Benutzer auf die Zifferntastatur tippt.
Das numberButtonPressed:
Methode wird jedes Mal aufgerufen touchUpInside
Das Ereignis wird für die Schaltflächen 0 - 9 ausgelöst. Da die Indizes 0-9 der toneSSIDs
Array enthält jetzt den entsprechenden Ton für jede Taste. Die folgenden drei Codezeilen reichen aus, um den entsprechenden Ton wiederzugeben:
-(IBAction) numberButtonPressed: (UIButton *) drückenButton int toneIndex = [gepressteButton.titleLabel.text intValue]; SystemSoundID toneSSID = toneSSIDs [toneIndex]; AudioServicesPlaySystemSound (toneSSID); self.phoneNumberString = [self.phoneNumberString stringByAppendingString: printedButton.titleLabel.text]; [self displayPhoneNumber];
Zeile 96 wandelt den Textwert des gedrückten um UIButton
Titel zu einer Ganzzahl aus einer Zeichenfolge.
Mit der Dialpad-Ziffer erhalten, Zeile 97 ruft ein SystemSoundID
von dem toneSSIDs
Array.
Auf Zeile 98, das AudioServicesPlaySystemSound
Die Funktion wird mit der gerade abgerufenen SSID aufgerufen, um die Wiedergabe des Tastentons zu starten.
Das ist es! Fahre fort und speichern und bauen das Projekt jetzt, und Sie sollten feststellen, dass die Tastaturnummern Soundeffekte haben!
Es gibt ein kleines Problem mit der aktuellen Lösung. Bemerken Sie die Verzögerung zwischen dem Berühren der Taste und dem erzeugten Ton? In Teil 6 dieser Serie wurden die Tasten des Tastenfelds so eingestellt, dass die Tasten ausgelöst werden touchUpInside
Aktion. Diese Aktion wird ausgelöst, nachdem der Benutzer den Finger von der Schaltfläche genommen hat. Der Ton sollte jedoch abgespielt werden, sobald der Benutzer auf die Taste tippt, nicht nachdem er den Finger abgenommen hat. Um dies zu beheben, öffnen Sie PhoneView.xib
, entferne das touchUpInside
IBAction
Verweise für alle Schaltflächen und binden Sie dann die einzelnen Schaltflächen Landung
Aktion zum numberButtonPressed:
Methode.
Wenn Sie Hilfe benötigen, um herauszufinden, wie Sie diesen Schritt ausführen können, wenden Sie sich einfach an Teil 6, Schritt 1 dieser Serie.
Dieses Tutorial war eine stürmische Tour durch das Audio Toolbox-Framework und die System Sound Services. Wenn Sie Fragen haben, können Sie sie gerne in den Kommentaren unten hinterlassen. Ich werde mein Bestes geben, um darauf zu antworten. Natürlich gibt es nicht genug Stunden am Tag, um alle meine letzten Beiträge jeden Tag auf neue Kommentare zu überprüfen. Wenn Sie also im Laufe der Monate etwas mehr Zeit haben, könnten Sie besser über Twitter Kontakt mit mir aufnehmen: @markhammonds.