Testes de interface no iPhone SDK com o UIRecorder

Escrito por Quintana em 15/01/10 12:30

Muitos desenvolvedores ainda não conhecem o grande poder da ferramenta Instruments, uma das três disponíveis no Kit de desenvolvimento do iPhone. Recentemente eu descobri que ela além de medir o desempenho de aplicações, uso de memória e tudo mais, também pode nos auxiliar nos testes de interface.

Já mostramos aqui, no nosso blog, a ferramenta open source Bromine, desenvolvida por nosso colaborador Felipe Barreto, com auxílio de Matt Gallagher. Com o Bromine é possível criar testes que simulam a interação com diversos elementos do iPhone (como tabelas, botões, etc) e verificar o resultado dessas interações. Contudo, como é possível testar interfaces mais complexas, como a de jogos, onde não existem botões, tabelas ou labels? Para isso, temos que ir no simulador e fazer os testes na mão mesmo. E se esses testes forem complicados de se reproduzir? Então usamos o UIRecorder!

O UIRecorder nada mais é do que um gravador e reprodutor das interações que você faz no iPhone Simulator. Primeiro, você deve abrir o iPhone Simulator e o Instruments e escolher o UIRecorder:

UIRecorder

Dentro do UIRecorder, vá em "Attach to Process" e escolha o processo do iPhone Simulator. Com isso ele ficará vinculado ao iPhone Simulator e estará pronto para salvar as suas interações. Abaixo, existe um vídeo mostrando o funcionamento da ferramenta:

Um bom exemplo é o aplicativo Mobits Button Soccer, onde a interação com os botões é complicada de simular com outras ferramentas e de reproduzir. Com o UIRecorder eu posso gravar os testes, modificar o código e depois reproduzí-lo para ver se tudo funciona.

A única desvantagem do UIRecorder é que ele não é capaz de determinar de forma automatizada se o software está funcionando ou não, como o Bromine faz, mas já é uma mão na roda para quem quer reproduzir interações complexas e onde o custo de ficar olhando se elas estão corretas é pequeno.

Leia também:

Interfaces mais atraentes no Windows Mobile

Escrito por Hildi em 13/01/10 18:40

Criar interfaces bonitas para Windows Mobile é um grande desafio, já que os componentes são um tanto limitados e a API não permite, por exemplo, o uso de imagens com transparência, label multi-line, ou até mesmo o efeito gradiente como background de algum componente. Então para fazer algo mais personalizado, é preciso criar ou modificar os componentes existentes e nem sempre isso é uma tarefa fácil.

Como tempo é dinheiro, muitas vezes modificar ou criar cada componente pode levar bastante tempo. Logo, seria interessante utilizar componentes prontos para facilitar a vida. Foi assim que descobri a Resco.net, uma empresa lá da Eslováquia que trabalha no desenvolvimento de soluções para Windows Mobile. Além de fazer aplicações e jogos, ela também desenvolve componentes para o WinMo: o Mobile Forms Toolkit. O toolkit oferece uma série de componentes, como listas, tabelas, abas, combo-box, e muitos outros, que podem ser personalizados de diversas maneiras: troca de cores, fundo gradiente, imagens, orientação e por aí vai. Além disso, ele é totalmente integrado ao Visual Studio.

Resco Mobile Forms Toolkit

A Resco disponibiliza uma versão trial que dura 30 dias. Para ter a versão paga, é preciso assinar um de seus planos. A licença é anual e cobre futuras atualizações, novos componentes e suporte. Para ver as singularidades e preços de cada plano, veja aqui.

Aqui na Mobits, baixamos a versão trial e podemos dizer que a ferramenta cumpre muito bem o que promete. Vale muito a pena! :)

Ah! Se você conhece alguma outra ferramenta semelhante, comente!

Quem já programou para iPhone conhece as facilidades que o Interface Builder fornece para fazer as suas telas. Para quem tem a árdua missão de elaborar as mesmas interfaces para Windows Mobile, não vai encontrar todas essas facilidades, o que pode prejudicar e muito o desenvolvimento e, consequentemente, a experiência do usuário.

Para exemplificar o que digo, mostro a vocês um problema que tive em Windows Mobile, que na teoria deveria ser bem fácil resolver: uma label que pode receber conteúdo dinâmico (acontece toda hora) e que o seu container deve ser redimensionado de acordo com esse conteúdo; se ele tiver que ter duas linhas, que aumente o seu tamanho para comportar duas. Se tiver três, que aumente mais um pouco.

Isso deveria ser tranquilo, certo? Errado. Ao pesquisar sobre como fazer isso, até descobri que há como fazer em C#, utilizando o método Graphics.MeasureString; porém, como muitas funcionalidades que a gente acha fuçando no Google, essa é mais uma que não está disponível para o Compact Framework.

Com o desânimo já batendo à porta, achamos em um dos últimos links procurados um site na Argentina de um desenvolvedor que implementou uma classe para tratar disso em Windows Mobile. Como sempre, pegamos a implementação dele, incorporamos ao nosso código, e colocamos de maneira mais fácil de ser utilizada.

Primeiro, baixe esse arquivo, que contém a definição da classe que iremos utilizar. Ela contém o código que faz toda a mágica. Chamo a atenção para o seguinte método:

internal static int GetLabelSize(Label label, Graphics graphics) {
    return CFMeasureString.MeasureString(graphics, label.Text, label.ClientRectangle, false).Height;
}

Com ele, basta você passar a label que você deseja saber a altura (height), usando o seguinte código:

minhaLabel.Height = CFMeasureString.GetLabelSize(minhaLabel, CreateGraphics());

O método CreateGraphics() é interno a um Form, de forma que a utilização da linha acima deve ser feita preferencialmente no formulário. Convém dizer que o GetLabelSize não funciona com todas as implementações de Label, como, por exemplo, o transparent label. Mas já quebra o maior galho :P.

Leia também:

Desenhando fragmentos de interface no Interface Builder

Escrito por Felipe Barreto em 08/01/10 14:52

Quem já começou a desenvolver suas apps para iPhone deve ter passado pelo processo padrão de criar interfaces no Interface Builder: cria o arquivo XIB, vincula-o à view de algum controller e carrega este último com o método - [UIViewController initWithNibName:(NSString *)n bundle:(NSBundle *)b].

Contudo, podem existir casos onde você queira definir apenas um pedaço da interface para ser utilizado diversas vezes por um mesmo controller ou por diversos controllers diferentes. Nestes casos, aparece um novo método:

// Em NSBundle
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options

Usado da maneira mais simples, este método retornará um array das views definidas na raiz de um determinado XIB.

Vamos ao exemplo.

Exemplo de Arquivo XIB

Ao carregar o XIB acima com o seguinte código:

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"Fragmentos" owner:nil options:nil];
UIView *cabecalho = [views objectAtIndex:0];
UIView *rodape = [views objectAtIndex:1];

o array obtido conterá somente as views Cabecalho e Rodape, pois são as que estão no nível mais alto. As outras views serão naturalmente carregadas, pois são subviews das principais.

Depois de incluir suas novas views na sua tela, o resultado final poderá ser algo como:

Tela com fragmentos de interface

Você ainda pode definir um objeto de uma classe que você tenha criado como owner do XIB. Desta maneira, poderá utilizar os recursos de ligação dinâmica que o Interface Builder fornece para ligar os elementos visuais às propriedades IBOutlet da sua classe. Para isso, basta definir a classe do seu objeto no File's Owner do arquivo XIB, configurar as ligações e carregá-lo com o comando NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"Fragmentos" owner:meuObjeto options:nil];

Desempenho

Apesar de facilitar muito no desenho de interfaces complexas, o carregamento dos XIB é naturalmente mais lento que a criação de views via código puro, portanto, em situações onde o XIB tenha de ser carregado diversas vezes em um curto espaço de tempo, deve-se avaliar o impacto sobre a performance. Um caso comum seria criar um XIB para definir a aparência da célula de uma tabela. Eu venho utilizando esse recurso constantemente nos novos projetos, mas tenho que ficar atento a tudo que posso fazer para compensar o carregamento lento como, principalmente, o reaproveitamento de células já carregadas.

Como falei acima, venho utilizando este recurso sempre que possível nos projetos e tenho aumentado muito a produtividade na criação de interfaces. Se tiver alguma dúvida sobre o funcionamento, fique a vontade para pedir ajuda.

Leia também:

Nexus One versus iPhone

Escrito por Karin em 06/01/10 18:19

Nexus One versus iPhone

O tão aguardado lançamento do celular "da Google", Nexus One, foi ontem (05/01). Infelizmente o aparelho não está disponível para o Brasil (e ainda não tem previsão), somente para Estados Unidos, Inglaterra, Cingapura e Hong Kong.

A Google realmente entrou no mercado móvel para competir com a Nokia e a Apple e já traz na bagagem o seu sistema operacional Android e o reconhecimento da sua marca. Mas por que celular "da Google"? Porque ela não fabricou sozinha o aparelho, que utiliza tecnologia da HTC, grande fabricante de celulares.

Como muitos estão dizendo que o principal alvo da Google é a Apple, então compararemos as principais especificações técnicas de seus aparelhos para termos uma noção do que cada um proporciona para seu usuário final.

Nexus One iPhone
Altura 119 mm 115,5 mm
Largura 59,8 mm 62,1 mm
Profundidade 11,5 mm 12,3 mm
Display 800x480 pixels / touchscreen 480x320 pixels / multi-touch
Foto 5 megapixels com flash 3 megapixels
Vídeo possui a partir do 3GS
Conexões EDGE / GSM / Wi-Fi / Bluetooth EDGE / GSM / Wi-Fi / Bluetooth
Recarregamento tradicional e USB tradicional e USB
Tempo em fala 7 horas 5 horas
Tempo em standby 250 horas 300 horas
Tempo em vídeo 7 horas 10 horas
Tempo em áudio 20 horas 30 horas
Sistema operacional Android Mobile Technology Platform 2.1 (Eclair) iPhone OS v3.1.2
Memória 1 GB e cartão SD de 4 GB (expansível até 32 GB) 8, 16 ou 32 GB - não possui cartão
Localização GPS / Bússola e Acelerômetro / Wi-Fi / Rede telefônica GPS / Bússola (a partir do 3GS) e Acelerômetro / Wi-Fi / Rede telefônica
Market place Android Market App Store
Site Especificações do Nexus One Especificações do iPhone

De acordo com o quadro, podemos observar que ambos apresentam características bem parecidas. Destaque para a resolução da tela e a câmera que são melhores no Nexus One. Já a preocupação que a Apple tem com a bateria do iPhone pode ser vista acima, pois na comparação com o aparelho da Google observamos melhor desempenho.

Mas não estamos aqui para falar do iPhone e sim do Nexus One. Além das especificações técnicas destacadas, o aparelho traz uma série de funcionalidades. São elas:

  • integração com o Google, podendo fazer qualquer busca desejável;
  • integração com o Google Maps, que auxilia na navegação;
  • integração com o Gmail, para poder visualizar seus e-mails;
  • integração com o Picasa, para visualizar seus álbuns;
  • integração com o YouTube, enviando vídeos gravados no próprio aparelho;
  • integração com a lista de contatos do Facebook;
  • entrada de texto com teclado acionável por voz;
  • customização da tela inicial e descanso de tela;
  • widgets;
  • câmera com flash, zoom digital, efeitos;
  • leitura das mensagens do correio de voz.

É pessoal, não sei se a Google conseguirá ser páreo para a Apple, porém ela está entrando com força no mercado móvel com o Nexus One, que traz a vantagem de ser integrado com vários serviços da própria Google, que nós hoje não conseguimos viver sem. E esse é o foco da Google com o Nexus One, usuários que precisam da Internet o tempo todo e à mão!

Vamos ver como o mercado responde a essa novidade e se a Apple responderá com alguma novidade. A gente se vê!

O que fazer quando comprar na Apple Brasil

Escrito por Karin em 06/01/10 13:09

Olá pessoal,

infelizmente estou aqui para escrever um post para relatar um problema que tivemos com a loja da Apple Brasil. Como tivemos problemas no processo de compra para pessoa jurídica, escreverei aqui o que fazer quando adquirir produtos da Apple Brasil e, assim, evitar que você passe pela mesma situação que passamos.

Não comprar por telefone

Acredito que esse tenha sido o nosso principal erro. Segundo o site, ganharíamos desconto fazendo a compra por telefone e desistimos da compra pela Internet. E por que tivemos problema? Porque o cadastro dos dados para a compra não é feito por você e sim por um atendente, que mal treinado, pode errar seu cadastro e provocar um grande estrago. E foi o que ocorreu. Ao invés do atendente fazer a compra para pessoa jurídica, o que foi solicitado e confirmado diversas vezes, ele fez em nome de um dos sócios, ou seja, pessoa física. E o pior, acabamos fazendo o pagamento sem perceber o erro e, posteriormente, descobrimos que era tarde demais!

Pensar bem antes de desistir da compra

Após descobrir o erro, verificamos com a nossa contabilidade que não seria possível ficar com o produto, que tinha como sacado na nota uma pessoa física e não jurídica (como deveria ser)! Então, tivemos que ligar para a Apple Brasil para poder cancelar o pedido. Aí começou o nosso grande tormento, pois não foi somente uma vez que ligamos, mas várias vezes e telefonemas loooooooooooooongos!

Ter paciência

Mas para que? Porque acredite, você passará muito tempo no telefone descobrindo que os atendentes da Apple Brasil não foram treinados igualmente, pois cada um sabe coisas diferentes com relação ao mesmo assunto. Várias vezes tivemos que fazer diferentes telefonemas para tentar resolver a mesma questão: cancelamento da compra! O mais "legal" era que depois de ficar horas no telefone, muitas vezes a ligação caía e a gente tinha que ligar e falar novamente tudo que já tinha sido falado em outra ligação, pois eles não tem número de protocolo, acredita?!

Ligar mais de uma vez

Essa dica é bem útil, pois depois de várias ligações, descobrimos que alguns atendentes diziam que a gente é que deveria enviar o produto de volta para a Apple Brasil, mas outros diziam que o produto seria buscado no lugar da entrega por uma transportadora sem nenhum ônus, ou seja, quando você quiser resolver seu problema e aquele antendente não está conseguindo, desligue e ligue novamente. :P

Não acreditar nos e-mails enviados pela Apple Brasil

É isso mesmo! Vários e-mails foram enviados pela Apple Brasil, porém nenhum foi cumprido. Desde o prazo de entrega até e-mail de confirmação de devolução de produto que não foi devolvido. Só de e-mails confirmando o pagamento e informando a data de entrega recebemos 3!!! E, sem surpresa, cada um com uma data diferente. Menos supresa ainda foi receber o produto na somente última das datas informadas.

Conclusão

O que tiramos disso tudo? Que não valeu a pena ter corrido atrás de um desconto, pois, no fim das contas, a gente acabou ganhando foi um grande transtorno, que levou bastante tempo da gente!

No final da história, cancelamos o pedido depois de muito sacrifício e compramos o mesmo produto em outra loja, que acabou sendo mais barato e a entrega bem mais rápida, porque na Apple Brasil o prazo de entrega é de até 20 dias!

E pensam que acabou? Não! Até hoje (06/01) não recebemos o dinheiro de volta e várias ligações já foram feitas para tentar resolver este outro problema.

É isso aí! Esperem as cenas dos próximos capítulos!

Leia também:

  1. Os 10 mandamentos para obter a licença de desenvolvedor da Apple e publicar na App Store