chester's blog

technology, travel, comics, books, math, web, software and random thoughts

Desenvolvimento para iPhone: instalando o toolchain

11 May 2008

iphoneA capacidade de hardware e software já fazem do iPhone uma plataforma atrativa para criar aplicativos. É difícil falar em número de usuários no Brasil – oficialmente são zero, tem relatório dizendo que são um mol. Mas o fato é que os aparelhos são populares entre os formadores de opinião (basta observar a enxurrada deles em qualquer evento sobre web), o que garante um público no mínimo interessante.

Este post dá uma visão superficial das alternativas para desenvolvimento mais populares e documenta as dificuldades que encontrei para colocar no meu Mac o conjunto de ferramentas livres que permite compilar aplicações.

Existem (pelo menos) três caminhos para construir aplicações para o iPhone:

  • iPhone Web Apps A idéia é usar tecnologias web (HTML, JavaScript, CSS, AJAX, server-side scripts, etc.), hospedando as aplicações remotamente e rodando via Mobile Safari. Existem guidelines oficiais, livros (gostei deste) e pelo menos dois frameworks (iUI e jPint) que ajudam a tornar as aplicações web parecidas com as nativas – os resultados são surpreendentemente bons.

    As desvantagens são as mesmas de qualquer aplicação web: acesso limitado ao sistema (dá pra saber se o fone está em pé ou deitado, fazer chamadas e acessar o Maps, mas não tem como ler o acelerômetro ou acionar o iPod, entre outras coisas) e a necessidade de estar online para usar a app (agravada no Brasil, onde a cobertura de WiFi é mais restrita e os planos de dados tornam caro usar o EDGE).

    A facilidade de desenvolvimento, distribuição e instalação falam alto, tornando este caminho uma excelente opção para aplicações de uso casual, ou que dependam fortemente de recursos online (agregadores de dados, clientes/front-ends para sites e assemelhados).</li>

    • Apple iPhone SDK</p> O SDK da Apple é tentador: o beta é baseado numa IDE amigável (XCode), e gera aplicações que irão rodar em qualquer iPhone – quando for lançado definitivamente. O mais provável é que elas sejam distribuídas via iTunes, viabilizando a venda de software a baixo custo.

      Nem tudo são flores: é preciso se familiarizar com Objective C, e tudo o que for desenvolvido tem que ser aprovado pela Apple – que impõe restrições técnicas (nada de processos em segundo plano) e de domínio (p0rn está vetado). Além disso, o XCode só roda em Mac, e (o problema mais sério): ainda não é possível distribuir as aplicações.</li>

      • iphone-dev toolchain + installer.app</p> O Installer é uma aplicação conhecida de que tem iPhone desbloqueado: ele permite localizar e instalar centenas de pacotes de software gratuito (boa parte sendo software livre). Estes programas são criados, em sua maioria, através do iphone-dev toolchain – um kit baseado em ferramentas livres para desenvolvimento UNIX (essencialmente gcc/make, usando llvm para viabilizar a compilação cruzada) e empacotados em um formato que o Installer.app entende.

        A única restrição é que o usuário tem que ter um iPhone desbloqueado. Você também fica sujeito ao esquema de distribuição do Installer – um pequeno risco a correr, mas é razoável crer que continuará funcionando no futuro, e que será menos restrito que a proposta da Apple. </li> </ul> Para começar a brincar eu optei pela terceira via. É um caminho meio tortuoso, já que é preciso baixar/compilar todo o software do qual o iphone-dev depende. Na real eu descobri (meio tardiamente) que é possível baixar o toolchain pré-compilado para Mac OS X Leopard – mas compilar ainda é o único caminho para quem usa Windows/Linux/Mac OS X Tiger.

        Teoricamente basta seguir o passo-a-passo oficial – na prática, a teoria é outra. Por exemplo, eu já tinha o llvm instalado via DarwinPorts, mas a ferramenta exige uma versão em particular, então tive que desinstalar primeiro. Da mesma forma, para compilar o odcctools foi preciso prestar atenção ao issue 31. De fato, a lista de issues ajuda um bocado nessas horas.

        O link que informa como obter uma cópia do sistema de arquivos do iPhone está quebrado. Um método razoável é baixar da Apple, só que é preciso des-criptografar, seguindo estas instruções. Outra alternativa é copiar instalando o OpenSSH e usando o scp a partir do micro, na forma scp -Cr root@ip.do.seu.iphone:/Diretório ., para cada diretório desejado). Tive que fazer isso para um ou dois arquivos que deram problema com o outro esquema.

        Por falar em OpenSSH, eu achei meio sinistro ter um servidor ssh rodando sendo que as senhas dos dois usuários (mobile e root) são as mesmas em todos os iPhones, e resolvi mudar. NÃO FAÇA ISSO! – o aparelho entoru em loop (provavelmente o SpringBoard ou algum programa dependente tem uma chave de login chumbada, e usar o passwd atropela ela), e pra voltar só restaurando o /etc/passwd original – o que só foi possível porque o OpenSSH estava lá.

        Um ponto que me assusta um pouco no passo-a-passo é um certo excesso de sudo. E não sei exatamente o que eu fiz de errado, mas algum desses passos sobrescreveu um arquivo de sistema do meu Mac (era um binário universal que passou a só ter o código ARM), deixando o micro inutilizado até que eu dei boot pelo DVD de instalação (nem o boot single-mode funcionava mais) e copiei o arquivo de volta. Esteja preparado para este tipo de problema.

        A última parte (que é o build final dos binários) enroscou por conta de algum problema acontecido na criação dos headers. Até consegui concluir o processo copiando alguns .h do SDK beta do iPhone, mas ao tentar dar build das aplicações novos problemas eram encontrados. Solução: baixei o toolchain pré-compilado e copiei o diretório de headers dele sobre o meu.

        Com isso foi possível compilar um hello world básico e rodar no telefone. Ainda é preciso empacotar para o Installer, mas isso é uma segunda fase.

        Agora é só programar! :-)

        UPDATE: O kit também funciona direitinho no Linux (Ubuntu 8.04 num Eee PC). Eu segui este outro guia passo-a-passo e a coisa rolou praticamente sem problemas (os poucos que tive estão documentados nos comentários do guia).