Criando aplicativos para o iPhone no Linux (sem Xcode e MacOS X)

Consultando diversos especialistas da plataforma iPhone, não obtive sucesso na busca de alternativa ao desenvolvimento para os aparelhos da APPLE no Linux. Mas no fundo o Cortex-A8 é um processador ARM, então deixo neste documento como usar o compilador llvm-gcc-4.2 para a arquitetura Darwin-Arm, assim permitindo criar binários para os dispositivos APPLE a partir de fontes C/C++ e Obj-C.

[ Hits: 55.049 ]

Por: Alessandro de Oliveira Faria (A.K.A. CABELO) em 09/11/2010 | Blog: http://assuntonerd.com.br


Instalação, compilação e utilização



Requisitos e instalação:

Software proprietário:

Começaremos pela parte proprietária. O arquivo do firmware e SDK 3 do iphone (iPhone1,2_3.0_7A341_Restore.ipsw e iphone_sdk_3.0__leopard__9m2736__final.dmg) são imprescindíveis e serão obtidos por conta própria no site da APPLE ou em FTPs públicos espalhados pela internet (megaupload, rapidshare entre outros). É uma pena, pois se o licenciamento permitisse, a imagem do LiMobile traria consigo já todos os arquivos instalado pronto para compilação.

Hardware:

O aparelho precisa estar desbloqueado com o jailbreak, cydia, openssh, afc2add e MobileTerminal (opcional). Não vou entrar em detalhes com relação ao desbloqueio do mesmo para não fugir do escopo principal deste documento.

Dependências:

A lista abaixo de dependências básicas foi o que motivou a criar o LiMobile, não quero passa por esta saga novamente:
  • automake
  • bison
  • cpio
  • flex
  • g++
  • g++-4.3
  • g++-4.3-multilib
  • gawk
  • gcc-4.3
  • git-core
  • gobjc-4.3
  • gzip
  • libbz2-dev
  • libcurl4-openssl-dev
  • libssl-dev
  • make
  • mount
  • subversion
  • sudo
  • tar
  • unzip
  • uuid
  • uuid-dev
  • wget
  • xar
  • zlib1g-dev

Primeiramente, baixe o script toolchain.sh do projeto iphonedevonlinux:

svn checkout http://iphonedevonlinux.googlecode.com/svn/branches/3.0/ ./

Na sua pasta home crie as pastas Projects/iphone/toolchain/files/firmware e copie o arquivo do firmware e SDK nas pastas conforme o exemplo abaixo.

mkdir -p ~/ Projects/iphone/toolchain/files/firmware
$ cp iphone_sdk_3.0__leopard__9m2736__final.dmg ~/ Projects/iphone/toolchain/files
$ cp iPhone1,2_3.0_7A341_Restore ~/ Projects/iphone/toolchain/files/firmware


Para iniciar os downloads, compilação e toda magia-negra automatizada, execute o script toolchain.sh:

./toolchain.sh all

O script efetuará o download e compilará alguns pacote como:
  • dmg2img - Converte imagens/arquivos .dmg para imagens hfsplus. Mais informações no site oficial.
  • llvm-gcc - Compilador utilizado para objetos nativos, bitcode LLVM de programas escrito em C/OBJC. Informações no site oficial.
  • Ferramentas open source para o Darwin (www.opensource.apple.com), o lado opensource do Mac. Abaixo a lista dos pacotes.

http://www.opensource.apple.com/tarballs/cctools/cctools-667.8.0.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_authorization/libsecurity_authorization-32564.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cdsa_client/libsecurity_cdsa_client-32432.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cdsa_utilities/libsecurity_cdsa_utilities-33506.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cms/libsecurity_cms-32521.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_codesigning/libsecurity_codesigning-33803.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cssm/libsecurity_cssm-32993.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_keychain/libsecurity_keychain-34101.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_mds/libsecurity_mds-32820.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_ssl/libsecurity_ssl-32463.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_utilities/libsecurity_utilities-32820.tar.gz
http://www.opensource.apple.com/tarballs/libsecurityd/libsecurityd-33470.tar.gz
http://www.opensource.apple.com/tarballs/DiskArbitration/DiskArbitration-183.tar.gz
http://www.opensource.apple.com/tarballs/IOKitUser/IOKitUser-388.2.1.tar.gz
http://www.opensource.apple.com/tarballs/IOGraphics/IOGraphics-193.2.tar.gz
http://www.opensource.apple.com/tarballs/IOHIDFamily/IOHIDFamily-258.3.tar.gz
http://www.opensource.apple.com/tarballs/IOStorageFamily/IOStorageFamily-88.tar.gz
http://www.opensource.apple.com/tarballs/IOCDStorageFamily/IOCDStorageFamily-39.tar.gz
http://www.opensource.apple.com/tarballs/IODVDStorageFamily/IODVDStorageFamily-26.tar.gz
http://www.opensource.apple.com/tarballs/WebCore/WebCore-351.9.tar.gz
http://www.opensource.apple.com/tarballs/CF/CF-476.14.tar.gz
http://www.opensource.apple.com/tarballs/configd/configd-210.tar.gz
http://www.opensource.apple.com/tarballs/xnu/xnu-1228.7.58.tar.gz
http://www.opensource.apple.com/tarballs/xnu/xnu-1228.3.13.tar.gz
http://www.opensource.apple.com/tarballs/Libc/Libc-498.tar.gz
http://www.opensource.apple.com/tarballs/launchd/launchd-258.1.tar.gz
http://www.opensource.apple.com/tarballs/DirectoryService/DirectoryService-514.23.tar.gz
http://www.opensource.apple.com/tarballs/JavaScriptCore/JavaScriptCore-466.1.tar.gz

Durante a execução, o código fonte do dmg2img será copilado para posterior utilização no pacote SDK do iPhone.

Trying to mount the iPhone SDK dmg...
dmg2img v1.6.1 is derived from dmg2iso by vu1tur (to@vu1tur.eu.org)
/home/mobile/Projects/iphone/toolchain/files/iphone_sdk_3.0__leopard__9m2736__final.dmg--> /home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img
reading property list, 522739 bytes from address 2237401625 …
partition 0: begin=195, size=430, decoded=284
partition 1: begin=914, size=430, decoded=284
partition 2: begin=1632, size=430, decoded=284
partition 3: begin=2367, size=430, decoded=284
partition 4: begin=3088, size=430, decoded=284
partition 5: begin=3799, size=516090, decoded=347564
partition 6: begin=520170, size=430, decoded=284
decompressing:
opening partition 0 ...         [2] 100.00%  ok
opening partition 1 ...         [2] 100.00%  ok
opening partition 2 ...         [2] 100.00%  ok
opening partition 3 ...         [2] 100.00%  ok
opening partition 4 ...         [2] 100.00%  ok
opening partition 5 ...      [8684] 100.00%  ok
Archive successfully decompressed as /home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img
You should be able to mount the image [as root] by:
modprobe hfsplus
mount -t hfsplus -o loop /home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img /mnt
In order to extract iphone_sdk_3.0__leopard__9m2736__final.dmg, I am going to mount it.
This needs to be done as root.
SDK is version 3.0.1
Extracting iPhoneSDKHeadersAndLibs.pkg...
Extracting MacOSX10.5.pkg...
Unmounting iPhone SDK img...
Headers extracted.


Logo em seguida, o arquivo de firmware do iPhone é descompactado para extração dos arquivos necessários com a chave criptográfica obtida em tempo real na internet.

Checksum of firmware file is valid.
Archive:  /home/mobile/Projects/iphone/toolchain/files/firmware/iPhone1,2_3.0_7A341_Restore.ipsw
inflating: /home/mobile/Projects/iphone/toolchain/tmp/Restore.plist  
Firmware Details
Device Class: iPhone
Product Version: 3.0
Build Version: 7A341
Restore RamDisk: 018-5305-002.dmg
Restore Image: 018-5301-002.dmg
Board Config: n82ap
Unzipping 018-5301-002.dmg...
Archive:  /home/mobile/Projects/iphone/toolchain/files/firmware/iPhone1,2_3.0_7A341_Restore.ipsw
inflating: /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg  
We need the decryption key for 018-5301-002.dmg.
I'm going to try to fetch it from http://www.theiphonewiki.com/wiki/index.php?title=VFDecrypt_Keys:_3.x....
I found it!
Mounting 018-5301-002.dmg...
Decrypting 018-5301-002.dmg...
dmg2img v1.6.1 is derived from dmg2iso by vu1tur (to@vu1tur.eu.org)
/home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted --> /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img

reading property list, 116195 bytes from address 208878440 …
partition 0: begin=195, size=430, decoded=284
partition 1: begin=914, size=430, decoded=284
partition 2: begin=1632, size=430, decoded=284
partition 3: begin=2367, size=430, decoded=284
partition 4: begin=3088, size=430, decoded=284
partition 5: begin=3800, size=105735, decoded=71204
partition 6: begin=109817, size=430, decoded=284
decompressing:
opening partition 0 ...         [2] 100.00%  ok
opening partition 1 ...         [2] 100.00%  ok
opening partition 2 ...         [2] 100.00%  ok
opening partition 3 ...         [2] 100.00%  ok
opening partition 4 ...         [2] 100.00%  ok
opening partition 5 ...      [1775] 100.00%  ok
Archive successfully decompressed as /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img
modprobe hfsplus
mount -t hfsplus -o loop /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img /mnt
In order to extract 018-5301-002.dmg, I am going to mount it.
This needs to be done as root.
Copying required components of the firmware...
Unmounting...
Firmware extracted.
Building the toolchain...
Finding and extracting archives...
cctools-667.8.0
CF-476.14
configd-210
DirectoryService-514.23

...

Vá tomar um CAFÉ...

...
Se tudo estiver bem, a compilação do llvm-gcc e outros finalizará e teremos as seguintes mensagens finais:

checking where to find the target ranlib... pre-installed
checking where to find the target strip... pre-installed
checking where to find the target windres... pre-installed
checking whether to enable maintainer-specific portions of Makefiles... no
updating cache ./config.cache
creating ./config.status
creating Makefile
Building gcc-4.2-iphone...
Build progress logged to: /home/mobile/Projects/iphone/toolchain/toolchain/bld/gcc-4.2-iphone/make.log
It seems like the toolchain built!
Cleaning up...
All stages completed. The toolchain is ready.


Para compilar o um programa em c, basta entrar na para ~/Projects/iphone/toolchain/apps/HelloWorldFirst. Encontraremos nesta pasta um convencional HellWord conforme o exemplo abaixo, para compilá-lo basta utilizar o comando make.

#include <stdio.h>
int main()
{
     printf("Hello World\n");
     return 0;
}

Vamos direto ao código em objetive-C, localizado em ~Projects/iphone/toolchain/apps/HelloToolchain. Ao entrar nesta pasta utilize o comando make para compilar o projeto. E logo em seguida define o IP do seu dispositivo móvel para um posterior deploy como no exemplo abaixo:

make
$ export IP=10.0.0.2
$ make deploy


Pronto, nesta etapa o dispositivo sera reiniciado e um novo aplicativos será acrescentado na area de trabalho. Para finalizar, deixo abaixo um vídeo demonstrativo do projeto o LiMobile.

Como sempre menciono... Colaborar atrai amigos, competir atrai inimigos...
Sobre o autor: http://www.netitec.com.br/alessandro

Página anterior    

Páginas do artigo
   1. Introdução
   2. Instalação, compilação e utilização
Outros artigos deste autor

Impressione seus amigos com o Tux bonitinho no login modo console

Como fazer o seu servidor Linux enviar avisos em seu celular Claro sem custo

Como instalar o Interbase 6

LibreOffice em nuvem - Crie seu servidor Web Office

Transforme o seu celular Android em webcam sem fio na plataforma Linux

Leitura recomendada

Como funcionam os alocadores de memória do STD C?

Bug afeta todas as distros

Desenvolvendo para microcontroladores em GNU/Linux

Android NDK: Desmistificando o acesso a códigos nativos em C

Acessando a porta paralela via Linux

  
Comentários
[1] Comentário enviado por matux em 09/11/2010 - 11:34h

Cabelo, mais uma vez você demonstra profundos conhecimentos, profissionalismo e uma profunda curiosidade/pro-atividade.
Meus parabéns.
São pessoas que tem atitudes semelhantes a tua que fazem a comunidade open-source mais forte.
Belo artigo e espero que suas iniciativas motivem aos estudantes de computação em nosso país.
Um forte abraço!
Ps. Já está nos favoritos!

[2] Comentário enviado por rodrigo.slacklin em 09/11/2010 - 12:10h

http://www.saurik.com/id/4
http://code.google.com/p/iphone-dev/
http://stackoverflow.com/questions/276907/starting-iphone-app-development-in-linux

Fontes que datam antes da sua publicação.
Seja mais honesto Cabelo, site as fontes, não queira a glória toda pra você só porque montou o lego.

[3] Comentário enviado por cabelo em 09/11/2010 - 12:34h

Rodrigo Slacklin:

Em primeiro lugar, quero deixar bem claro que gosto de críticas, pois só com elas consigo evoluir, como também não quero, glória pois não teve genialidade nenhuma e vc tem razão apenas montei o lego.

Deixei bem claro também sobre a sua colocação referente a glória na entrevista como Jomar (http://www.itweb.com.br/blogs/blog.asp?cod=86). "Não foi genialidade nenhuma (inclusive não posso deixar de agradecer o Erisvaldo Júnior que diminuiu bastante o meu tempo de aprendizado), foi apenas paciência, calma, pesquisa séria e desafio (estou com o iPad faz uns 4 meses), nas horas vagas para relaxar e sair da rotina, bastou juntar uma série de projetos open-source como iFuse (que permite montar o ipad/iphone no file system), dmg2img converte imagens e aquivos dmg, compilador gnu objetive-c, ferramentas opensource para o darwin e o script iphonedevonlinux, para chegar na imagem ideal (utilizando o suse studio) linux baseda no openSUSE"

Inclusive na página da imagem LiMobile (http://pt.opensuse.org/Utilizador:Cabelo/LiMobile) menciono todos os pacotes opensource utilizado como também o objetivo do projeto.

"O principal objetivo desta iniciativa é proporcionar a composição rápida do ambiente de desenvolvimento para dispositivos móveis da APPLE até para usuários com pouco conhecimento na plataforma GNU/Linux. Sendo o foco principal é evitar transtornos de dependências de pacotes e incompatibilidade de versões. Compilar um gcc para gerar instruções para o iPad e iPhone não necessita de muita técnica especial, pois Cortex A8 é baseado no núcleo do ARM11 ;-)"

Finalizando, meu objetivo foi facilitar a utilização de todos estes recursos opensource...

Abraços.

[4] Comentário enviado por luanyata em 09/11/2010 - 12:47h

Cabelo... mais uma vez sensacional...
Obrigado por compartilhar seu conhecimento e suas pesquisas...

[5] Comentário enviado por paulorvojr em 09/11/2010 - 21:56h

Cabelo a ideia é muito interessante, e uma alternativa claro. belo trabalho.

Mas convenhamos que desenvolvedores como você e eu não vamos utilizar isto em produção.

Melhor pagar 99 doletas a apple por ano, para pode publicar nossos apps a applestore e ganhar dinheiro. Sem isso não é possível.

Desbloquear o aparelho para inserir os testes eu acho valido e faço isso, mas pra produção nada de jailbreak.

usuários mesmo da apple que compram apps, não fazem jailbreak, so maioria dos brasileiros que mau ve um aparelho ja quer desbloquear e acha que ta abafando, so perde com os updates. estimativas indicam que 90% compra na itunes e nada de unlock.

a grande receita eu falo para todos,

vmware + snow leopard + xcode(SDK 3.0) + jailbreak com cydia no iphone/ipod. façam testes e mais testes, sem complicação.

quer ganhar dinheiro no object-c? entao assina a apple anualmente e seja feliz, até calculadora simples ganha 99 centavos de dolar fácil.




[6] Comentário enviado por removido em 11/11/2010 - 12:38h

As aplicações desenvolvidas neste modelo pode ser publicadas nas Apple Store ?

[7] Comentário enviado por anonymous em 11/11/2010 - 20:40h

Cabelo,
Mais uma vez, mandou mt bem!

[8] Comentário enviado por nitro em 20/07/2011 - 11:29h

Exelente Tutorial.. Parabens. Estou pra comprar um iMac, mas com essas dicas acho que vou economizar uma graninha...kkkkkkkkkkkk

[9] Comentário enviado por Noobix em 25/07/2011 - 12:53h

Gostaria de saber se é possivel instalar o seu programa em um Mint, nao encontro o pacote de nome xar para baixar, caso encontre o programa rodará aqui? Onde posso achá-lo?
grato

[10] Comentário enviado por franzbutu em 15/09/2013 - 11:28h

Alguém pode me ajudar nisso?
Tenho o Ubuntu 12.04 fiz todo os procedimentos de download, porém ao executar comando para fazer o download e a compliação não deu certo (tenho o gcc instalado):

francisco@francisco-desktop:~/iOS$ ./toolchain.sh all
Preparing the environment
Toolchain version: 3.0
Building in: /home/francisco/iOS
The following commands are missing: xar bison flex
You may need to install additional software for them using your package manager.

[11] Comentário enviado por andersonbambam em 06/10/2013 - 10:19h

Olá amigo, belo material mas eu gostaria de saber se existe alguma IDE que possa auxiliar o desenvolvimento, para não ficar preso a VI ou VIM no shell.

[12] Comentário enviado por Azraelm em 25/08/2015 - 04:37h

Ótimo artigo.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts