domingo, 9 de outubro de 2016

5 Mudanças para atualizar seu projeto XCode para o iOS10




A cada lançamento de um novo iOS é normal a necessidade de atualizar o nosso código (Objective-C ou Swift) de nossos projetos para compatibilizar com a nova versão. Métodos ou classes depreciadas ou novas instruções são comuns. E tem sempre alguma UIView ou Autolayout que quebra e não funciona mais.


Infelizmente, nem todos os detalhes são encontrados facilmente ou centralizados em um tópico apenas na WWDC 2016 ou em algum guia da Apple.

Resolvi escrever uma lista de coisas que tive que lidar para atualizar em nossos projetos para que tudo funcione no iOS10. Vamos lá :

  1. Aviso de privacidade para acesso a câmera.
Uma das coisas irritantes é que quando você vai tentar acessar a câmera pela primeira vez ele apresenta um alerta para o usuário para permitir ou não o acesso, e nesse momento, como seu código legado não tem o aviso, ele quebra. É necessário agora colocar como parâmetro em sua Info.plista frase deaviso do porque você estará utilizando o acesso.
A chave é :Privacy - Photo Library Usage Description & Privacy - Camera Usage Description

  1. Aviso de privacidade para acesso ao calendário.
Outro que vai precisar de atenção nesse ponto é o calendário do app, agora também é necessária a frase de aviso.
A chave é :Privacy - Calendars Usage Description


  1. Ativar a capacidade de Push Notifications no Xcode para registrar o device token & Atualizar o framework UserNotifications para lidar com as ações do usuário.

Esse ajuste quase passou batido. Mesmo assistindo as duas sessões sobre notificações da WWDC nem vi menção alguma dessa “obrigatoriedade”. Agora no iOS 10, ele se você não ativar a capacidade de Push Notificationno seu projeto, ele não vai gerar o device token. Além disso, ele cria uma chave no seu arquivo entitlements.








Para lidar com as ações de clique do usuário na notificação, tanto em background como em foreground, você deverá utilizar o novo framework UserNotifications que integra-se com as ações básicas e novas formas de interações com as notificações que temos no iOS10. 

Para isso, deverá alterar a forma que seu código registra essas notificações e trata as ações dela. Vou deixar um link para uma thread do StackOverflow que resume a implementação  e sugiro também assistir a WWDC 2016 com o tema Introducing to Notifications


  1. Agora Views sem constraints se comportam como o definido no AutoResizingMask.

Pretendo escrever um artigo apenas sobre essa mudança, mas de cara, toda view que é adicionada de forma dinâmica, ou seja, através do método addSubviewdeve ser revista para que sua proporção e comportamento não seja inesperado no iOS 10 e em diferente tamanhos de telas de devices.Você pode conferir na secão What's New in Autolayout WWDC 2016.


  1. Xcode agora irá assinar e gerar os profiles automaticamente no seu projeto.
Uma mudança para melhor no Xcode é o fato de ele cuidar sozinho da assinatura de provisioning profile do seu projeto. Isso é muito bacana, mas ao mesmo tempo, se seu projeto legado já tinha todos os parâmetros de provisioning profileajustados, você deve conferir se as configurações foram mantidas adequadamente. No meu caso, foi melhor mudar para a forma automática e deixar ele se econtrar sozinho. Além disso, na Build Settings temos duas chaves para definir os Provisioning's, um depreciado e outro atual, ficou meio bagunçado a meu ver. Você pode conferir na secão What's New in Code Signing WWDC 2016.




Pode haver muitas outras coisas dependendo do framework que estiver utilizando, mas até o momento essas foram as principais que encontrei ao mudar meu projeto legado para o iOS 10. 


domingo, 28 de agosto de 2016

Como tornar seu aplicativo compatível com iPv6 no iOS


A partir de 01 de julho de 2016 a AppStore tornou como requisito obrigatório de aprovação a compatibilidade do seu aplicativo com redes iPv6 , protocolo que substituirá o IPv4 porque este já está chegando em seu limite máximo de combinações.


Para isso, a Apple disponibilizou um guia de como verificar e testar se seu aplicativo está compatível. Este guia explica um pouco dos motivos dessa mudança, as vantagens do novo protocolo iPv6 bem como como a internet irá mudando aos poucos para esse novo padrão. 

Em um resumo deste guia, basicamente, deve-se evitar colocar endereços de IP de forma direta nos seu código. Como exemplo , evite colocar https://127.0.0.1 e coloque a url completa https://www.meusite.com , desta forma os servidores já devem estar preparados para fazer a modificação necessária no roteamento desse endereço.

Além disso, para obter uma forma mais segura de validar isso, é possível aplicar um teste na sua aplicação utilizando o seu Mac através do compartilhamento da internet.

1 - Vá na aba de compartilhamento do seu Mac e clique na opção de compartilhamento “segurando a tecla Option" 



2 - Depois disso, crie um compartilhamento da internet usando o Wi-fi




3 - Após clicar nesta opção, você já pode liberar a tecla Option. Por causa dela a opção Habilitar IPv6 NAT64 irá aparecer!



Pronto! Agora é só proceder com os testes dos seus serviços, usando a sua conexão para servir seu aplicativo.

Este guia é uma ponto básico, você poderá aprofundar mais no assunto no link da documentação da Apple. 

terça-feira, 22 de setembro de 2015

iOS 9 Novas regras de segurança obrigam webservices somente em https (TLS)

21 de setembro de 2015 




Com a chegada do iOS9 a Apple tomou várias medidas para aprimorar a segurança em seu sistema operacional móvel, chamada de App Transport Security , essa feature força seu aplicativo a manter conexões seguras quando consumir webservices. Todas as conexões que utilizam as classes NSURLConnectionCFURL, or NSURLSession   
 são obrigadas a utilizar HTTPS (TLS) , e se não o fizer, o seu executável irá lançar uma exceção. 

Agora, para continuar utilizando sua conexão em http normal, você deverá lançar uma propriedade específica no seu arquivo Info.plist para que seu aplicativo não entre nesta validação de segurança, ou por domínio,ou para a app inteira. 

Ao compilar o projeto no novo XCode 7, seu projeto já deverá contar com isso. Caso seu aplicativo esteja na loja esse comportamento não irá comprometê-lo, a menos que você envie uma nova atualização que foi compilada pelo XCode 7. 

Para utilizar conexões seguras  sem problemas, você deverá verificar os certificados HTTPS do seu servidor. A Apple considera alguns padrões mínimos de segurança que seu certificado deve fornecer para atender essas exigências. Isto é muito sério, já tivemos graves problemas quando certificados que não possuem as cadeias completas não atendiam no iOS e simplesmente não efetuada a conexão.

Para validar o certificado do seu servidor HTTPS, acesse este site https://cryptoreport.websecurity.symantec.com/checker/views/certCheck.jsp e confira se o resultado do teste da sua url atende as exigências da documentação da Apple, que você encontrará aqui : https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/


Considere seriamente no ciclo de vida da sua aplicação que muito em breve a Apple pode tornar isso um padrão, sem caminho para remover essa validação,forçando seu webservice ser obrigatóriamente em HTTPS. 

quarta-feira, 9 de setembro de 2015

iOS : Como ajustar o Auto Layout de uma view dinamicamente para sobrepor um outro que foi escondido (hidden).




Aplicar o autolayout  costuma ser algo delicado, há diversas formas de criar as regras de restrições conforme os espaçamentos entre os objetos.  Uma das coisas que acontece com frequencia é a necessidade de atualizar a distancia de um objeto em relação a um outro, quando este não precisa aparecer por não ter um conteúdo. Veja por exemplo a célula abaixo : 





Estou aplicando as regras de auto layout na imagem no objeto UIImageView , note a definição de largura e altura. 

Essa minha célula, poderá ou não vir com esta imagem, ou seja, o objeto ora estará visível ou ora estará escondido (hidden). 

O resultado que espero no tempo de execução, é que a label se estique até o final, caso o conteúdo de nossa UIImageView esteja escondido, para isso, vamos usar uma classe que é uma categoria que auxilia a definir dinamicamente as regras de constrain do autolayout de qualquer view : https://github.com/damienromito/UIView-UpdateAutoLayoutConstraints

Agora , basta importar a categoria e usar o método para mudar a propriedade desejada do auto layout da view, que em nosso exemplo, é a constante de largura, quando o objeto não aparecer : 
          [imageView setConstraintConstant:0 forAttribute:NSLayoutAttributeWidth];

Com isso, toda vez que uma imagem não estiver disponível, o autolayout da nossa label vai estivcar até o limite da célula sobrepondo a área vazia deixada pela nossa UIImageView


O resultado acima simula o que acontecerá em tempo de execução. Uma observação importante, se o compilador mostrar diversos warning’s, é porque a regra da constante para o campo que você estará alterando, deve ser flexível, ou seja, permitir um valor entre 0 até o máximo definido, veja na imagem, que o <= mostra que nossa restrição pode estar de 0 até o máximo definido, que anteriormente foi de 64. 

Essa técnica é muito útil na hora de construir as views, reduzindo a necessidade de fazer células diferentes para layout diversos.