Creare applicazione per iPhone senza avere mac ne hackintosh

[SIZE=“4”]Operazioni preliminari:[/SIZE]

  1. Assicurarsi di avere openssh installato e attivo sull’iphone ed essere in grado di connettersi senza problemi.
    La connessione ssh dovete poterla utilizzare sia per scambiare file (protocollo scp, utilizzate client come winscp su win e cyberduck su mac) sia come terminal vero e proprio per inviare comandi! (su windows utilizzate putty, su mac il terminal integrato)

  2. Scaricare sul computer gli headers per la compilazione (versione per firmware 2.2 aggiornati con tutto l’immaginabile): iphone headers sdk 2.2 + api + substrate

[SIZE=“4”]Creare l’ambiente di sviluppo:[/SIZE]

  1. Installate sull’iphone tramite cydia il pacchetto ldid.

  2. Installate sull’iphone tramite cydia il pacchetto gcc

  3. Installate sull’iphone tramite cydia il pacchetto make

  4. Con un client ssh (scp) trasferire la cartella include (scompattata dall’archivio scaricato) dentro /private/var in modo da avere dentro /private/var/include tutti i file .h e le varie sottocartelle (se la cartella esiste già per vide del gcc installato, sovrascrivete pure :D).

[SIZE=“4”]Prima applicazione - Ciao mondo da linea di comando:[/SIZE]

  • Scaricate il progetto di esempio hello.zip, è un semplice printf("Ciao mondo
    "); con il relativo makefile. Decomprimetelo e mettere la cartella hello sotto la root / dell’iphone.

  • Connettetevi in ssh al telefono, questa volta per lanciare comandi (quindi o putty o terminal) login root pw alpine e digitate i seguenti comandi:

cd …
cd …

Ora sarete nell root vera e propria, cioè /. Digitate il comando

cd hello

ed entrerete nella dir appena copiata con il mio progetto, digitate:

make all

Il programma hello sarà compilato e signato dall’ldid di saurik :smiley:

  • A questo punto se la compilazione va a buon fine potrete avviare il vostro programa digitanto:

./hello

[SIZE=“4”]Seconda applicazione - Ciao mondo grafico:[/SIZE]

  • Scaricate il programma MyApp.zip e decomprimete la cartella MyApp sempre sotto la root dell’iphone (/MyApp).

  • Entrate in questa dir con i soliti comandi “cd” sempre via putty

  • Compilate con il comando “make package” che si preoccuperà di copiarvi anche i file dentro /Applications/MyApp.app e impostare tutto

  • Respringate :smiley:

PS: Si possono utilizzare anche le librerie non documentate e quindi avere completo accesso a tutte le funzioni del firmware iphone

PS2: Lanciare i comandi su iphone tramite la connessione ssh con putty o terminal potrebbe essere evitato se si utilizza l’applicazione MobileTerminal scaricabile da cydia (se lo fate dovrete però loggarvi come root, con il comando “su root”, pw alpine). E’ comunque molto più comodo utilizzare la tastiera di un computer e lavorare in remoto.

[SIZE=“4”]Aggiornare toolchain firmware 3.x:[/SIZE]
Col nuovo 3.x non è più possibile installare il compilatore GCC su iphone in quanto non è più disponibile la libreria libgcc necessaria per il funzionamento (saurik non la ha portata in quanto ha detto che non è compatibile, quindi ha riscritto le applicazioni che la usavano senza dire niente in merito al compilatore).
Esiste un modo per far credere a cydia di avere la liggcc installata e quindi poter scaricare e usare il compilatore gcc su 3.x.

Per farlo occorre installare manualmente il pacchetto fake-libgcc_1.0 (dell’autore Ryan Petrich, lo stesso del vecchio Clippy) tramite ssh, scaricandolo da qui e lanciando il solito comando dpkg -i.
Una volta fatto sarete in grado di installare gcc tramite cydia e seguire la guida.

Gli headers:
Ovviamente gli headers sono cambiati (non tutti) col nuovo firmware ed è necessario estrarre i nuovi .h e librerie dal nuovo SDK (scaricabile gratuitamente dal sito della apple).
Poi successivamente gli headers privati per usare le funzioni non documentate dovranno essere estratti manualmente dal firmware iphone, usando il tool classdump.
Questa volta il processo non lo faccio io, lo farete voi.

(Una da dumpare sicuramente è la springboard, quindi con class-dump-x-iphone -H /System/Library/CoreServices/SpringBoard.app/SpringBoard)

Grande figata… :o

solo un chiarimento…“Il programma hello sarà compilato e signato dall’ldid di saurik” cos’è “ldid”??

Ho fatto qualche modifica per rendere piu chiaro il tutto, comunque:

Punto 3) con anche il link al sito di saurik da cui si legge:

[…]I wrote a tool called ldid that, among other things, can generate the SHA1 hashes that are checked by Apple’s iPhoneOS kernel.

[fonte]

oppure se vuoi capire meglio la questione (in italiano) leggiti la premessa teorica che trovi a questo link .: Suondmao’s World - iPhone iapd Reverse Engineering :. nel punto Passo 3: firma

Precisazione…

Una sola domanda/chiarimento.
Io conosco un po’ UNIX (pur non essendo un guru), ma a quanto ne so io basta dare il comando: SU (Super User) senza inserire ‘root’. In teoria entrando nella modalità Super User ci si dovrebbe già trovare in root, vero? Almeno io faccio così col mio iPhone… ditemi se sto sbagliando o no.

Ehehe si funziona lo stesso, ma perchè se non metti specificatamente il nome utente si assume di default root :smiley:
Se sei root e vuoi tornare mobile allora dovrai per forza scrivere “su mobile” per esempio.
(io comunque “su” lo ho sempre inteso come come switch user non come “super user”).
Ti cito wikipedia:

su (abbreviazione dalla lingua inglese di switch user o di substitute user, cambia utente o sostituisci utente) è un comando dei sistemi operativi Unix e Unix-like che permette di avviare una shell testuale assumendo l’identità di un altro utente del sistema
[…]
La sintassi tipica di su è la seguente:

su [-] [utente [arg1 …] ]

Il parametro facoltativo utente specifica il nome dell’utente di cui si desidera assumere l’identità. Se non specificato si assume sia root.

link: su (Unix) - Wikipedia

Prima di tutto grazie per la guida!! :slight_smile:
Ho provato, e va tutto liscio fino a quando non eseguo il comando cd hello
a quel punto mi dice che non esiste nessun file o directory con quel nome, eppure io ho copiato la cartella sotto root :confused1:

Controlla bene come ti muovi anche da scp:
Quando ti loggi tramite ssh parti da /private/var/root.
Tu devi tornare indietro con i comandi “cd …” di due cartelle, per arrivare allora root /.
Quindi esegui una volta e sei in /private/var, un’altra volta e sei in / (perchè in realtà @var è un collegamento a private/var).
Ed è quei che devi aver messo da scp la cartella hello!
controlla da scp di avere /hello, se questa c’è allora sbagli a “navigare” con i comandi in console

(io poi ho detto di lavorare sotto / perchè io sto sempre li, nessuno ti vieta di lavorare in /private/var/root e creare /private/var/root/hello qui dentro)

Avevi ragione, navigavo male io :stuck_out_tongue:

Funziona tutto! :slight_smile:

compili anche? riesci anche a avviare l’app e vedere la scritta “hello world”?

Per compilare compilo, il problema è avviare la app, quando dò il comando ./hello mi esce killed.

detto cosi cosa capisco io?
…copiami almeno l’esatto output dal putty…

sorry, hai ragione.
Un sec e ti faccio sapere.

edit:
Comando ‘./hello’ fallito con codice di ritorno 137 e messaggio di errore -sh:line 6: 204 killed ./hello

Non so che dirti…lavori come root quando compili ed esegui? nel senso esegui dal putty o dal mobileterminal?
Adesso non ho molto tempo per aiutarti, ma è sicuramente una sciocchezza se sei riuscita a compilare…

Ho risolto :slight_smile:
Adesso compilo ed eseguo senza problemi. Di preciso non sò cosa andava storto, però ho rifatto tutta la procedura da capo disinstallando e reinstallando i vari componenti e adesso funziona sia da putty che da mobile terminal.

Bene allora!
Se vuoi buttarti nel grafico e sull’object magari inizia compilando questo: HelloWorld on iPhone - The iPhone Wiki
ma non so se funzionerà cosi senza modifiche…

Ora che ho superato il blocco nel software che stavo facendo da mesi e mi preparo al rilascio ho occhi e tempo solo per quello :smiley:

Comunque elisa il punto della guida che diceva di installare il “make” da cydia andava fatto? o il make si installa automaticamente col gcc?

Ora faccio qualche piccolo esperimento, la cosa si fa divertente :smiley:

Il “make” va installato separatamente dal gcc, ho provato pure senza tanto per vedere se era compreso con il compilatore ma non andava.

Complimenti per il tuo software, mi immagino la soddisfazione quando hai risolto il problema che ti bloccava :wink:

Guida aggiornata con esempio grafico :smiley:
http://www.iphoneitalia.com/forum/dev-center-community/11494-creare-applicazione-per-iphone-senza-avere-mac-ne-hackintosh.html

grande tool…nn vedo l’ora di poter iniziare a fare qualcosa…

seguendo alla lettera la guida esce fuori questo :frowning: ho separato un attimo i miei comandi e quelli del Makefile con gli errori che poi riporta mentre compila

  • COMANDI
    /$ cd MyApp
    /MyApp$ make package
    /usr/bin/gcc -c -fsigned-char -g -ObjC -fobjc-exceptions -Wall -Wundeclared-selector -Wreturn-type -Wnested-externs -Wredundant-decls -Wbad-function-cast -Wchar-subscripts -Winline -Wswitch -Wshadow -I/var/include -I/var/include/gcc/darwin/4.0 -D_CTYPE_H_ -D_BSD_ARM_SETJMP_H -D_UNISTD_H_ main.m -o main.o
    /usr/bin/gcc -c -fsigned-char -g -ObjC -fobjc-exceptions -Wall -Wundeclared-selector -Wreturn-type -Wnested-externs -Wredundant-decls -Wbad-function-cast -Wchar-subscripts -Winline -Wswitch -Wshadow -I/var/include -I/var/include/gcc/darwin/4.0 -D_CTYPE_H_ -D_BSD_ARM_SETJMP_H -D_UNISTD_H_ MyAppDelegate.m -o MyAppDelegate.o

  • ERRORI
    MyAppDelegate.m: In function ‘-[MyAppDelegate applicationDidFinishLaunching:]’:
    MyAppDelegate.m:10: error: ‘UIHardware’ undeclared (first use in this function)
    MyAppDelegate.m:10: error: (Each undeclared identifier is reported only once
    MyAppDelegate.m:10: error: for each function it appears in.)
    MyAppDelegate.m:10: warning: no ‘-initWithContentRect:’ method found
    MyAppDelegate.m:10: warning: (Messages without a matching method signature
    MyAppDelegate.m:10: warning: will be assumed to return ‘id’ and accept
    MyAppDelegate.m:10: warning: ‘…’ as arguments.)
    MyAppDelegate.m:15: error: ‘UITextLabel’ undeclared (first use in this function)
    MyAppDelegate.m:15: error: ‘label’ undeclared (first use in this function)
    MyAppDelegate.m:34: warning: ‘UIWindow’ may not respond to ‘-orderFront:’
    MyAppDelegate.m:35: warning: ‘UIWindow’ may not respond to ‘-makeKey:’
    MyAppDelegate.m:36: warning: ‘UIWindow’ may not respond to ‘-_setHidden:’
    MyAppDelegate.m:39: warning: ‘UIWindow’ may not respond to ‘-setContentView:’
    make: *** [MyAppDelegate.o] Error 1