Vecchio Mac, vecchio iPhone, perché non svilupparci una app?

Beh, Apple non è d’accordo e dall’installazione del sistema di sviluppo alla firma del codice, cercherà in tutti i modi di impedirlo.

Ma una via esiste.

Ufficialmente l’iPhone SDK è stato rilasciato solo per Mac con processori Intel ma è possibile farlo funzionare anche su un vecchio PowerPC.

Intanto bisogna capire quale usare e procurarselo, e già questo non è  banale.

Ho cercato in vari modi di usare l’ultimo iPhone SDK (3.1.2) allegato all’ultimo Xcode (3.1.4) compatibile con PPC (“iphone_sdk_3.1.2_with_xcode_3.1.4__leopard__9m2809.dmg”), Xcode non ha problemi ma purtroppo non c’è stato verso di compilare per iPhone SDK 3.x. Installandolo come nella procedura che segue, alla prima compilazione Interface Builder si lamenta di non riuscire ad usare IBCocoaTouchPlugin (che a quanto pare è stato realizzato esclusivamente per processori Intel) ed anche se si tenta di utilizzare un qualsiasi altro SDK 2 installato da quest’immagine – anche se per il simulatore si riesce a compilare ed eseguire – quando si tenta il deploy sul dispositivo reale, gcc si lamenta affermando che c’è un “bad cpu type in executable”. In rete sembra che nessuno sia riuscito ad ovviare a questo problema, per questo (dopo una ventina di ore) mi sono rassegnato ad utilizzare l’ultima versione del 2.

Purtroppo non è legale ridistribuire questo software, quindi toccherà cercare su google:

“iphone_sdk_for_iphone_os_2.2.19m2621afinal.dmg”

non ci dovrebbe volere molto, questa è l’immagine dell’ultima versione dell’SDK 2 compatibile con PPC.

Se Xcode è già installato (dopo aver fatto gli opportuni backup) si può rimuoverlo con il comando da terminale:

sudo /Developer/Library/uninstall-devtools –mode=all

e cestinando la cartella /Developer (o quella dove si è deciso di installare Xcode).

Una volta scaricata e montata l’immagine, avviando l’installer ci si rende subito conto che non è possibile installare automaticamente l’iPhone SDK ma solo Xcode.

Ho provato a modificare il file di distribuzione (iPhoneSDK.dist contenuto in iPhone SDK.mpkg) per sviare il controllo sul processore facendogli credere di girare su un Intel: se pure l’installazione viene portata a termine, non è stato poi possibile compilare perché evidentemente a questo stadio l’installer decide anche quale compilatore installare, saltando quello per ppc.

Procediamo comunque con l’installazione di Xcode con le opzioni di default (o aggiungendo WebObjects se desiderato e Mac OS X 10.3.9 Support che permette di compilare con una vecchia versione di gcc, la 3.3, se si vuole compilare anche per questo vecchio OS).

Terminata l’installazione di Xcode, procediamo all’installazione manuale dell’iPhone SDK:
Apriamo la cartella Packages contenuta nell’immagine dell’SDK, avviamo il file DeveloperDiskImage (necessario per far girare il compilato su un dispositivo reale) e tutti i file che iniziano per “iPhone” (se volete tentare la fortuna con SDK 3, evitate di installare iPhoneSDKSnowLeopardExtras). Di default l’installer userà la root come path di installazione mentre Xcode utilizza la cartella /Developer quindi dovremmo specificare questa cartella (o quella scelta per l’installazione di Xcode) agli installer dell’SDK, per tutti tranne che per il pacchetto iPhoneSystemComponents (che contiene le estensioni ed i framework per la connessione sia alle periferiche reali che al simulatore, specificando una posizione errata Xcode visualizzerà l’errore “Error Starting Executable No provisioned iPhone OS device is connected.” in fase di esecuzione, dopo la compilazione) che invece andrà installato nella root (specificando quindi solo il disco, senza selezionare alcuna cartella).

Terminata l’installazione possiamo aprire Xcode (che si trova nella cartella /Developer/Applications), creando un nuovo progetto (File/New Project) troveremo nel tab di sinistra la categoria iPhone OS e potremo scegliere il tipo di applicazione da creare. Scegliendo View-based Application, cliccando Choose…, dando un nome al progetto e cliccando Save avremo una bozza di applicazione. Nella finestra principale del progetto dovrebbe essere automaticamente selezionato il target “Simulator – 2.2.1 | Debug”, tentando di compilarla con “Build and Go” riceveremo l’errore “No architectures to complie for (ONLY_ACTIVE_ARCH=YES, active arch=ppc, VALID_ARCHS=i386).”

Questo dipende dalla dichiarazione delle architetture valide per la compilazione delle app per l’iPhone SDK che evidentemente è solo per intel (i386). Per ovviare a questo problema, dopo esserci assicurati di aver chiuso Xcode, editeremo il file

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

cliccandolo con il tasto destro e scegliendo di aprirlo con TextEdit.

Modificheremo la riga 12:

Name = “Standard (iPhone Simulator: i386)”;

in questo modo:

Name = “Standard (iPhone Simulator: ppc)”;

e la riga 16:

RealArchitectures = ( i386 );

in questo modo:

RealArchitectures = ( ppc );

e aggiungeremo alla fine del file, prima dell’ultima parentesi tonda questa serie di parametri:

// PowerPC
{
Type = Architecture;
Identifier = ppc;
Name = “PowerPC”;
Description = “32-bit PowerPC”;
PerArchBuildSettingName = “PowerPC”;
ByteOrder = big;
ListInEnum = NO;
SortNumber = 106;
},

Salviamo il file e riapriamo Xcode, a questo punto dovrebbe essere possibile compilare senza problemi per il simulatore.

Se tentiamo invece di compilare per il device (selezionando Device – 2.2.1 | Debug nel menù in alto a sinistra) Xcode ci comunicherà l’errore “CodeSign error: Code Signing Identity ‘iPhone Developer’ does not match any code-signing certificate in your keychain. Once added to the keychain, touch a file or clean the project to continue”.

Per risolvere alla radice questo problema poiché non sarà comunque possibile pubblicare app compilate con questo sistema sull’App Store ufficiale, dopo aver chiuso Xcode, modifichiamo il file

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/SDKSettings.plist

in modo che il Code Signing non sia più necessario, per fare questo copiamo il file sul desktop, apriamolo con TextEdit e modifichiamo le seguenti voci:

<key>CODE_SIGNING_REQUIRED</key>
<string>YES</string>

sostituendo YES con NO, stessa cosa con la voce

<key>ENTITLEMENTS_REQUIRED</key>
<string>YES</string>

salviamo il file e ricopiamolo nella cartella originale, ci verrà chiaramente chiesta l’autenticazione.

Riapriamo Xcode ed il nostro progetto di prova, clicchiamo con il tasto destro sul nome del progetto sotto il tab “Groups & Files” e clicchiamo “Get Info”, nel pannello delle info, alla voce Code Signing, impostiamo il parametro “Don’t Code Sign” sia per la voce “Code Signing Identity” sia per “Any iPhone OS Device” e assicuriamoci che alla voce “Architectures” siano impostati i parametri “Architectures” su “Standard (iPhone OS: armv6); “Base SDK” su “Device – iPhone 2.2.1”; “Build Active Architecture Only” attivo; “Valid Architectures” su “armv6”

A questo punto colleghiamo il device e dal menù Windows di Xcode apriamo Organizer, nel tab a sinistra, sotto la voce Devices dovrebbe comparire il device che abbiamo appena collegato, se abbiamo installato la corretta Developer Disk Image, il device dovrebbe essere disponibile per il deploy.

Nel mio caso, avendo un iPhone 2G con iOS 3.1.3 mi sono dovuto procurare la Developer Disk Image contenuta nell’SDK 3.1.2 di cui ho parlato sopra, ho scaricato l’immagine e ho installato il pacchetto DeveloperDiskImage dalla cartella Packages.

Attivato il device per il deploy possiamo finalmente testare la nostra app direttamente sul nostro dispositivo reale cliccando “Build and Go”.