js' blog

iPhone-Entwicklung auf PowerPC und ohne Apple-Zertifikat
Created: 15.05.2009 16:29 UTC

So, ich hatte ja vor einiger Zeit schon versprochen, mal eine Anleitung zu schreiben, wie man das iPhone SDK auf einem PowerPC zum Laufen bringt mit einem gejailbreakten iPhone, ohne, daß man ein Zertifikat von Apple braucht. Da ich jetzt letztens mal das iPhone SDK neu installiert habe (ich hatte eine Mischung aus dem für iPhone OS 2.2.1 und dem für iPhone OS 3.0 drauf), habe ich das ganze mal nebenher ein wenig dokumentiert, um daraus anschließend einen Blog-Eintrag zu machen. Ich werde das ganze in 2 Teile aufteilen: Einmal den Teil, um das SDK auf einem PowerPC zum Laufen zu bringen und dann den Teil, um das ganze auf einem gejailbreakten iPhone ohne Apple-Zertifikat laufen zu lassen.

Also, zuerst zur Installation des SDK auf einem PowerPC: Zunächst installiert ihr das SDK ganz normal über die beiliegende .pkg-Datei. Während der Installation ist das iPhone SDK selber ausgegraut, aber die Installation der anderen Komponenten klappt problemlos. Um jetzt das SDK nachzuinstallieren, müssst ihr folgende Pakete aus dem entsprechenden Unterverzeichnis manuell über ein Programm wie Pacific installieren:

DeveloperDiskImage.pkg
iPhoneDocumentation.pkg
iPhoneHostSideTools.pkg
iPhoneSDK2_2.pkg
iPhoneSDKHeadersAndLibs.pkg
iPhoneSimulatorPlatform.pkg
iPhoneSystemComponents.pkg

Ich habe hier bewusst die SDKs für iPhoneOS 2.0 und iPhoneOS 2.1 weggelassen, da man sie eigentlich eh nicht braucht. Um jetzt den Simulator nutzen zu können, muß man das Xcode Spec File für den Simulator anpassen. Das findet man unter

/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/iPhone Simulator Architectures.xcspec

Dort gibt es eine Zeile

RealArchitectures = ( i386);

die man durch

RealArchitectures = ( i386, ppc);

ersetzt. Anschließend fügt man noch folgende Zeilen nach dem Intel-Kram hinzu:

    // G3
    {   Type = Architecture;
        Identifier = ppc;
        Name = "Minimal (32-bit PowerPC only)";
        Description = "32-bit PowerPC";
        PerArchBuildSettingName = "PowerPC";
        ByteOrder = big;
        ListInEnum = NO;
        SortNumber = 201;
   },

   // G4
   {   Type = Architecture;
       Identifier = ppc7400;
       Name = "PowerPC G4";
       Description = "32-bit PowerPC for G4 processors";
       ByteOrder = big;
       ListInEnum = NO;
       SortNumber = 202;
   },

   // G5 32-bit
   {   Type = Architecture;
       Identifier = ppc970;
       Name = "PowerPC G5 32-bit";
       Description = "32-bit PowerPC for G5 processors";
       ByteOrder = big;
       ListInEnum = NO;
       SortNumber = 203;
   },

Damit aber noch nicht genug. Anschließend müßt ihr noch codesign durch einen Wrapper ersetzen. Nennt also /usr/bin/codesign in /usr/bin/codesign.orig um und packt folgendes Script nach /usr/bin/codesign (Warnung: Das Script stammt nicht von mir, sondern von hier. Aber irgendwann werde ich das auch mal selber neuschreiben, weil es eben Perl ist):

#!/usr/bin/perl
$appDir = $ARGV[$#ARGV];
@tmpAry = split(/\//,$appDir);
$baseAppName = $tmpAry[$#tmpAry];
$baseAppName =~ s/\.app$//;
$realAppName = "$appDir" . "/$baseAppName";

$sign = 0;
for($b = 0; $b < $#ARGV; $b++) {
        if($ARGV[$b] eq "-s") {
                $sign = 1;
        }
}

$mums=`file $realAppName`;
if ($sign == 1 && $mums =~ /executable arm/) {
        #print "Signing armv6..\n"; 
        $dev = "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/";
        $tmp = "$appDir" . "/tmpbin";
        `$dev/lipo -create $realAppName -output $tmp`;
        `mv $tmp $realAppName`;
        system("/usr/bin/codesign.orig", @ARGV);
        `$dev/lipo -thin armv6 $realAppName -output $tmp`;
        `mv $tmp $realAppName`;
        system("rm $appDir" . "/CodeResources");
        system("cp $appDir" . "/_CodeSignature/CodeResources $appDir" . "/CodeResources");
        exit 0;
} else {
        exec '/usr/bin/codesign.orig', @ARGV;
}

Damit sollte der PowerPC-Teil abgeschlossen sein. Nun also zum Teil, Anwendungen ohne Zertifikat von Apple auf gejailbreakten iPhones installieren zu können:

Zunächst müßt ihr ein selbst-signiertes Zertifikat anlegen. Das geht am einfachsten über die Schlüsselbundverwaltung von OS X. Als Name wählt ihr einfach „iPhone Developer“ und als Typ Code Signing. Anschließend editiert ihr die Datei

/Developer/Platforms/iPhoneOS.platform/Info.plist

und fügt dort bei den OverrideProperties folgende Zeilen hinzu:

                <key>PROVISIONING_PROFILE_ALLOWED</key>
                <string>NO</string>
                <key>PROVISIONING_PROFILE_REQUIRED</key>
                <string>NO</string>

Nun müsst ihr auf dem iPhone noch via Cydia das Paket „MobileInstallation“ installieren und in der Info.plist eures Xcode-Projekts folgendes hinzufügen:

        <key>SignerIdentity</key>
        <string>Apple iPhone OS Application Signing</string>

So, jetzt sollte endlich alles laufen ;). Wenn ich was vergessen habe, mailt mir!