Auf dem iPhone gibt es 3 verschiedene Frameworks um Audio wiederzugeben: Core Audio, Celestial und Audio Toolbox. Zusätzlich existiert ein Audio-Daemon mediaserverd, welcher die Audio Ausgabe der verschiedenen Applikationen verwaltet und auf Events wie Telefonklingeln und das Ändern der Lautstärke reagiert. Core Audio ist das am wenigsten abstrahierte Framework (low-level), welches direkten Zugang zur Audio Hardware des iPhones bereitstellt. Es ist daher aber auch am unzugänglichsten von allen 3 Frameworks. Wenn man mit Core Audio versucht Audio Dateien wiederzugeben, dann wird der mediaserverd Prozess gekillt und damit auch die restliche Audio Ausgabe des iPhones. Daher werde ich nicht weiter auf dieses Framework eingehen. Interessierte bekommen mehr Informationen von der offiziellen Apple Developer Site. Audio Toolbox ist die nächst höhere Abstraktion und bietet Funktionen um einen digitalen Datenstrom mit Sound-Daten (zB. PCM) abzuspielen. Da dieses Framework nicht gerade einfach für Anfänger der Audio-Programmierung ist, werde ich darüber ein andermal schreiben. In diesem Beitrag möchte ich zeigen wie man mit Hilfe des Celestial Frameworks auf dem iPhone Audio wiedergeben und aufnehmen kann. Celestial ist am meisten abstrahiert, es ist vergleichbar mit QTKit bei normalen OS X Desktop Applikationen. Um eine Audio Datei abzuspielen benötigt man nur wenige Zeilen Code.
Um Fehler in einem Programm zu finden, benutzt man normalerweise einen Debugger. Da der iPhone-Code für ARM Prozessoren kompiliert wird, kann dieser auch nicht auf unserem Mac OS X oder Windows ausgeführt und damit auch nicht debugged werden. Dies ändert sich vielleicht mit dem offiziellen SDK von Apple, welches Ende Februar erscheinen soll. Wer trotzdem seinen Code debuggen muss, kann dies tun, indem er Text in der Konsole ausgibt. Dazu verwendet man in seinem iPhone Programm die Funktion NSLog(). Mit Hilfe dieser Funktion kann man sogar ganze Objekte dumpen. Hier ein kleines Beispiel:
Nachdem wir nun unser erstes Erfolgserlebnis mit dem Hello World Programm fürs iPhone hatten, möchte ich hier eine Anleitung veröffentlichen wie man in iPhone UIKit Applikationen auf die beliebte und schnelle Datenbank SQLite zugreifen kann. Unter OS X ab 10.4 (Tiger) kann man mit Core Data auf SQLite zuzugreifen, doch in der iPhone Firmware wurde bisher noch kein Core Data implementiert. Daher muss man entweder direkt die C-API von SQLite oder einen Cocoa Wrapper benutzen. Letzteres ist um einiges komfortabler, lesbarer und wartungsfreundlicher, daher ist diese Methode zu bevorzugen. In dieser Anleitung wird das hier beschriebene SDK benutzt, die Code-Beispiele funktionieren allerdings auch mit der herkömmlichen Makefile Methode (Toolchain ohne Xcode Template).
Das iPhone-dev team hat heute den offiziellen 1.1.3 Jailbreak für das iPhone und den iPod touch veröffentlicht. Beim inoffiziellen Jailbreak, der eigentlich nur für Entwickler bestimmt war, gab es offenbar vereinzelt Probleme. Diese sollen bei der neuen Jailbreak Methode nicht mehr vorkommen. Ebenso soll die neue Jailbreak Methode DRM Funktionen, wie zB. Nikita (Apples neuer Software Installer für das offizielle SDK) nicht beeinflussen, aber nur wenn der Jailbreak von 1.1.2 ausgeführt wird.
Because this is a soft update, the kernel cache is not upgraded. You will need to ensure you are on v1.1.2, otherwise this will cause certain DRM functionality, such as Nikita (Apple’s new software installer for the SDK) to malfunction.
So schnell kann es gehen. Das iPhone Dev Team hat die 2. Jailbreak Methode nun veröffentlicht. Der Jailbreak kommt wie bei 1.1.2 als "Upgrade", setzt also ein gejailbreaktes 1.1.1 oder 1.1.2 iPhone voraus. Eine deutschsprachige Anleitung für Mac und Windows findet man wie immer bei apfelmobil.de.
Den beiden zusammengeschlossenen iPhone dev Teams gelang es den asr key zu knacken. Dieser ist notwendig um mit vfdecrypt das Dateisystem der Firmware zu entschlüsseln. Durch den Zugriff zum Dateisystem können die Entwickler nun eine 2. Jailbreak Methode entwickeln, welche im Gegensatz zur 1. Methode sofort veröffentlicht werden soll. Ich frag mich allerdings ob der Key nicht schon vorher geknackt wurde, denn wie hätte Erica Sadun sonst die Dokumentation der Firmware 1.1.3 erstellen können?
Jonathan Zdziarski, besser bekannt als der iPhone-Hacker “NerveGas”, veröffentlicht demnächst sein erstes Buch über native iPhone Programmierung. Das Buch hat den Titel "iPhone Open Applications Development" und kann jetzt schon vorbestellt werden. Zdziarski ist der Programmierer von NES, dem Nintendo Emulator für das iPhone / iPod Touch. Er ist ein Verfechter von offener und freier Software und maßgeblich beteiligt am noch unveröffentlichten 1.1.3 Jailbreak.
Wie iPhone-Atlas berichtet, haben die Entwickler des 1.1.3 Jailbreaks diesen sehr vereinfacht. Es soll nun genau so einfach möglich sein wie bei der 1.1.2 Jailbreak Methode. Es ist aber immer noch nicht klar wann der Jailbreak denn nun veröffentlicht wird. Die Entwickler diskutieren immer noch darüber, ob sie abwarten sollen bis das offizielle SDK von Apple erschienen ist. Sie haben Angst, dass Apple die Lücke mit dem Erscheinen des SDK wieder schließen wird.
Jonathan "NerveGas" Zdziarski, der Entwickler von NES und einer der Köpfe des Jailbreak-Teams schreibt in seinem Blog, dass Entwickler teilweise ihre Programme für 1.1.3 umstellen müssen, da ab 1.1.3 die Programme nicht mehr mit dem Benutzer root, sondern mit dem ‘non-privileged’ Benutzer mobile ausgeführt werden. Alle Referenzen auf ‘/var/root’ müssen daher in ‘/var/mobile’ geändert werden.
Um iPhone Cocoa Programme schreiben zu können muss man natürlich die Klassen und deren Funktionen des iPhone Cocoa Frameworks kennen. Da es von Apple noch kein offizielles SDK und somit keine offizielle Klassenreferenz gibt, muss man sich anders behelfen. Die Lösung liegt in den Header Dateien, welche man sich mit class-dump aus den iPhone Frameworks (zu finden auf dem iPhone unter /System/Library/Frameworks) extrahieren muss. In den Header Dateien sind alle Funktionen und Mitglieder einer Klasse beschrieben, so dass man eine ungefähre Vorstellung hat wie sie einzusetzen ist. Allerdings ist die Suche in den Header Dateien nicht besonders komfortabel. Gottseidank gibt es das Tool Doxygen, mit welchem man relativ einfach eine brauchbare Dokumentation bzw. Klassenreferenz bekommt. Ich habe damit eine Dokumentation für die Firmware 1.1.2 erstellt. Erfahrene Cocoa bzw. Objective C Programmierer sollten sich damit schnell zurechtfinden. Anfängern empfehle ich, sich vorher in die Cocoa Programmierung einzuarbeiten. Es gibt inzwischen einiges an guten Büchern und viele gute Webseiten zu dem Thema, welche ich demnächst hier bei iPhone-dev.de vorstellen werde.
UPDATE 2.3.2008: Ich habe die Dokumentation für Firmware 1.1.2 mit der Dokumentation für Firmware 1.1.3 ersetzt.
Nachfolgend habe ich eine Anleitung geschrieben wie man mit dem hier vorgestelltem SDK sein erstes "Hello World Programm" erstellt. Diese Anleitung ist für alle die sich mit Programmieren auskennen, wer Objective C und Cocoa kennt ist natürlich klar im Vorteil, da UIKit Programme auf dem Cocoa Framework aufbauen.
Das iPhone-Dev-Team und das iPhone-Elite-Team haben gemeinsam den Jailbreak für Firmware 1.1.3. erreicht. Folgendes Video tauchte heute bei YouTube auf:
Anscheinend soll es aber erst nach Veröffentlichung von Firmware 1.1.4, welche zeitgleich zum offiziellen SDK herauskommen soll, veröffentlicht werden, damit Apple nicht wieder die Lücke mit 1.1.4 schließt. Kluger Schachzug sage ich.
Damit man überhaupt für das iPhone Programme schreiben kann, benötigt man einige Werkzeuge. Dies wären ein Compiler und Linker, sowie die benötigen Libraries und Header-Dateien. Diese Werkzeuge, in iPhone Developer Kreisen auch als "toolchain" bezeichnet, kombiniert mit einem guten Text Editor und anderen nützlichen Funktionen, bezeichnet man als Entwicklungsumgebung, auch IDE (integrated development environment) genannt. Unter OS X gibt es mit Xcode eine kostenlose IDE, welche durch Templates erweiterbar ist, so dass man damit problemlos iPhone Applikationen erstellen kann. Wie das im einzelnen geht möchte ich hier Schritt für Schritt erklären. Bevor es allerdings losgeht müssen folgende Voraussetzungen erfüllt sein:
Juhuuu, es ist da: mein neues iPhone. Als alter Entwickler interessiert mich natürlich wie ich das Teil programmieren kann. Apple hat bisher noch kein offizielles SDK für native iPhone-Applikationen veröffentlicht, sondern bietet nur auf die Möglichkeit Web-Applikationen zu entwickeln, welche auf dem Safari-Browser des iPhones ausgeführt werden. Die Möglichkeiten als Entwickler sind hier allerdings beschränkt, da man im Browser eingesperrt ist und es dadurch keine Möglichkeit gibt auf viele iPhone Funktionen zuzugreifen. In der Macworld am 15. Januar 2008 wird Steve Jobs ein offizielles SDK vorstellen, wann es aber erscheinen wird ist noch unklar. So lange wollte ich nicht warten und habe mich deshalb ein wenig im Web umgeschaut. Dank der Arbeit des iPhone-Dev Teams gibt es zahlreiche Anleitungen im Web zu finden, allerdings sind die meisten veraltet und funktionieren nicht unter einem neuen iPhone mit Firmware 1.1.2 OOTB und Bootloader 4.6. bzw. unter Leopard. Ich habe mich daher entschlossen diesen Blog zu eröffnen und meine Erfahrungen in Form von deutschen Anleitungen hier zu veröffentlichen.