Introdução ao HTML5

Nesta semana daremos início a um assunto que é cada vez mais pertinente para os desenvolvedores web e mobile: o HTML5. Um dos conceitos que esta linguagem propõe,  já foi abordado em um dos nossos artigos passados Multiplataforma, além deste conceito o HTML5 está se tornando um aliado de extrema importância para todos que estão trabalhando em projetos voltados a web services independente da plataforma utilizada.

O que é HTML5?

 HTML5 é a mais recente versão do HTML, que está sendo desenvolvida pela W3C e outros parceiros. Esta linguagem de marcação tem como um dos seus principais objetivos facilitar a manipulação de elementos, possibilitando que o desenvolvedor seja capaz de modificar características de objetos de uma forma não intrusiva e transparente ao usuário final.

Nesta nova versão, podemos notar novas tags e a modificação de tags já existentes. Nas versões anteriores não existia um padrão universal para a criação de seções comuns e específicas como, por exemplo, cabeçalho, menu, rodapé entre outros. Não havia uma padronização de nomenclatura de Classes, ID’s e tags. O HTML5 tenta trazer o conceito de escrever código e organizar a informação na página, facilitando a leitura para seres humanos. Traz mais semântica com menos código, promove uma maior interatividade sem a utilização de plugins e sem perda de desempenho. Alem desta características um fato importante nesta nova versão é a sua estrutura semântica.

 
Características do HTML5

DocType
HTML 4.01

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

XHTML 1.0

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

HTML5

<!DOCTYPE html>

Charset
HTML 4.01

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

XHTML 1.0

<?xml version="1.0" encoding="UTF-8"?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

HTML5

<meta charset="utf-8">

 
Estrutura Semântica
head = informação básica do menu de acessibilidade para celulares
header = cabeçalho da página
article = conteúdo
sidebar = barra lateral
footer = rodapé


 
 
 
 
 
 
 
 
 
 
 
Formulários
O HTML5 traz um novo conceito em formulários, a fim de facilitar o desenvolvimento em relação a validações do site ou aplicação.

<input type="number">
<input type="search">
<input type="range">
<input type="email">
<input type="date">
<input type="url">
<input type="week">

 
SVG
No HTML5 o formato SVG (Scalable Vectorial Graphics) pode ser embutido diretamente no documento com o uso do elemento img

<img src="imagens/rabisco.svg" alt="Rabisco em SVG" />
<svg >
<rect width="90" height="60" x="10" y="100" fill="#00FFCC" stroke="#FF0000" stroke-width="3" />
</svg>

 
Novas APIs

Geolocalização
Esta é uma das novas APIs que está sendo lançada junto ao HTML5. A partir desta API será possível verificar a localização do dispositivo ou da máquina através do próprio browser.

<p id="demo">Clique no botão para receber as suas cordenadas:</p>
<button onclick="getLocation()">Try It</button>
<script>
var x=document.getElementById("demo");
function getLocation()
  {
  if (navigator.geolocation)
    {
    navigator.geolocation.getCurrentPosition(showPosition);
    }
  else{x.innerHTML="O seu browser não suporta GeoLocation.";}
  }
function showPosition(position)
  {
  x.innerHTML="Latitude: " + position.coords.latitude +
  "<br />Longitude: " + position.coords.longitude;
  }
</script>

 
Canvas
O elemento Canvas é usado para desenhar gráficos, em tempo real, através de scripts (geralmente JavaScript), ele elemento é apenas um recipiente para gráficos, você deve usar um script para realmente extrair os gráficos.

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
</canvas>

<script type="text/javascript">

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.fillStyle="#FF0000";
ctx.fillRect(0,0,150,75);

 
Múltimidia
A tag de vídeo é uma das principais novidades do HTML5 atualmente já está sendo utilizada pelo Youtube entre outras empresas, com o uso desta tag gradativamente o Flash deverá perder espaço como um componente de vídeo.

<video width="320" height="240" controls="controls">
  <source src="movie.mp4" type="video/mp4" />
  <source src="movie.ogg" type="video/ogg" />
  Your browser does not support the video tag.
</video>

 
Web Storage
Com HTML5, páginas da web podem armazenar dados localmente no navegador do usuário.
Anteriormente, isso era feito com cookies. No entanto, armazenamento na Web é mais seguro e mais rápido. Os dados são armazenados em pares chave / valor, e uma página web só pode acessar os dados armazenados por si só.
 
Aplicação Offline
O HTML5 possui uma API para que você possar criar uma aplicação online, mas que possa trablhar offline quando necessário.O HTML indica ao browser elementos que deverão ser necessários e serem postos em cache para que a aplicação funcione offline.

Lista de Browsers que suportam

  • Firefox 3.5 +;
  • Chrome 9 +;
  • Opera 10.6 +;
  • Safari 5+;
  • IE 9 +;
     Mobile
  • iOS 3.2+;
  • Android 2.1+;
  • Opera Mobile 11+;

Estes são apenas algumas características deste “poderoso” HTML, certamente o HTML5 irá entrar no mercado gradativamente e facilitará a vida de desenvolvedores tanto no mercado web como no mobile, em uma nova oportunidade iremos abordar alguns cenários com estas APIs mais detalhadamente com exemplo de aplicações concretas.

Escrito por Marcel Guinther

Integrando o Eclipse ao Team Foundation Server

Introdução

Durante o desenvolvimento de um projeto pessoal, fui apresentado a um plugin para o Eclipse que me chamou a atenção. Percebi então, que este plugin na verdade poderia ser a solução de alguns problemas de Gerência de Configuração, como a padronização de processos de release de produtos. Resolvi trazê-lo para o conhecimento de todos através deste post. Este plugin que é pouco comentado no mercado, pode ser de grande utilidade para empresas que já possuem um Team Foundation Server (TFS) instalado (como é o caso da Mobiltec). Por mais que o SVN, Git e CVS sejam bons softwares de gestão de códigos fonte, é difícil para qualquer empresa ter que controlar diferentes tipos de servidores e ter que gerenciar diferentes tipos de releases de seus softwares. O ideal seria utilizar apenas um deles e unificar essa gestão. Pois bem, se a sua empresa já trabalha com o TFS e possui outros projetos em Java, o Team Explorer Everywhere 2010 (TEE) pode ser uma solução para unificar todos os processos da Gerência de configuração, centralizando tudo dentro do TFS. O TEE era de propriedade da empresa Teamprise que foi comprada pela Microsoft. Quem já possui uma subscription da MSDN, provavelmente tem direitos a este software e nunca ficou sabendo para que ele serve. Com este plugin, é possível integrar todas as funcionalidades do TFS no Eclipse, inclusive checkins vinculados a itens cadastrados no portal do TFS. É possível também controlar bugs, issues, etc., através deste plugin. Este plugin irá ajudar a Mobiltec em sua Gerência de Configuração, padronizando todos os projetos que são desenvolvidos em Java e C#, facilitando, assim a gerência dos projetos. O objetivo deste post será mostrar a instalação e demonstrar alguns recursos interessantes dessa ferramenta de integração, que auxiliam na gestão do desenvolvimento.

Instalação
Depois desta introdução é hora de por a mão na massa. O Team Explorer Everywhere 2010 SP1 está disponível para download aqui. O TEE SP1 é compatível com as versões 2005, 2008 e 2010 do TFS. É necessário ter o Eclipse, ou o IBM Rational Application Developer, ou ainda qualquer IDE baseado no Eclipse como o Aptana Studio e Adobe Flash Builder.

A instalação utilizada como exemplo será a do Eclipse, que é a ferramenta padrão de desenvolvimento Java aqui na Mobiltec. Para iniciar a instalação, baixe o arquivo zip TFSEclipsePlugin, usaremos ele mais adiante. O outro arquivo, TEE-CLC, é um cliente para acessar o TFS via linha de comando. Este cliente é cross-platform, ou seja, pode ser usado em qualquer sistema operacional, desde que suportado pelo programa. Não utilizaremos esse TEE-CLC, apenas o TFSEclipsePlugin. Depois do download concluído, no Eclipse, vá em Help e depois em Install New Software, conforme figura abaixo:

Na tela seguinte vá em Add e depois em Archive e selecione o zip baixado anteriormente. Em Name, pode ser colocado qualquer coisa (recomendação da Microsoft: Local Team Explorer plug-in archive). Feito isso, deverá aparecer o Plugin listado conforme a figura abaixo:

Adicionando o novo plugin

Marque o checkbox e clique em Next e novamente em Next. Aceite os termos da licença, e finalize. O plugin será instalado e será necessário reiniciar o Eclipse.

Utilizando o TFS Exploring

Depois que o Eclipse é reiniciado, para iniciar o cliente do TFS, vá em Window e depois em Open Perspective escolha Other. Irá aparecer uma lista de Perspectives parecida com a figura abaixo:

Abrindo perspectiva do TFS Exploring

Selecione a perspectiva Team Foundation Server Exploring. Este é o plugin para o Eclipse do TFS. Na visualização padrão, a esquerda é apresentado o servidor do TFS, e logo abaixo uma janela contendo os checkins pendentes. Outras janelas, como o History (histórico de alterações) podem ser encontradas em Window, Show View e depois em Other.

Para se conectar à um servidor TFS, utilize o botão abaixo da janela Team Explorer:

Conectar ao TFS

Irá aparecer uma janela mostrando os termos da licença, e antes de continuarmos, uma palavrinha sobre a licença.

Você poderá utilizar o TEE completo por 30 dias. Para trocar a licença do TEE, no Eclipse, vá em Window, Preferences e procure pelo caminho conforme a figura abaixo:

Troca da licença

Retomando, após aceitar os termos da licença, irá aparecer uma tela para adicionar um servidor TFS. Preencha os campos com as informações necessárias para se conectar ao seu servidor TFS.

Adicionando um servidor TFS

Principais Recursos

Abaixo uma lista dos principais recursos desse plugin.

Source Control

Source Control

Com o Source Control é possível explorar as soluções e os códigos fontes que estão no TFS. É possível visualizar históricos, realizar branches, merges, etc.

Work Items

Adicionando um work item

Podemos criar e consultar Work Items do projeto. Um Work Item pode ser um bug, uma issue ou mesmo uma tarefa que precisa ser realizada.

Synchronize

Sincronizando códigos fonte

Perspectiva que mostra as diferenças entre os fontes que estão na máquina do desenvolvedor e no servidor. Para abrir essa perspectiva, clique com o botão direito no projeto, depois em Team e Synchronize.

Vinculando Check-ins a Work Items

Realizando um checkin

Observe por esta imagem que podemos procurar por Work Items para que este possa ser vinculado ao check-in que o programador estiver fazendo. Assim fica fácil rastrear as correções de bugs e implementações de tarefas.

Conclusões

Observamos que a integração deste plugin com o TFS foi bem sucedida e este atendeu todas as expectativas. Com certeza será de grande utilidade nos projetos desenvolvidos para Android e J2EE. Agora falta descobrirmos uma integração entre o XCode e o TFS. Alguém tem uma sugestão? Bom, acho que isto é assunto para um futuro post. Até mais!

Escrito por Paulo Sérgio Morandi

Segurança em Aplicações Mobile: Lock Wipe no Windows Mobile [Parte 2/2 Lock]

Um pouco mais de um mês atrás, o colega Maycon Roberto publicou sobre a implementação de Lock e Wipe no dispositivo Android e, posteriormente, apresentou a primeira parte desse artigo, que trata do Wipe (ou Hard Reset) no Windows Mobile. Hoje daremos continuidade a esses assuntos relacionados à segurança, através de uma visão geral sobre Lock no Windows Mobile, utilizando o .NET Compact Framework em C#.

A Função Principal: SHDeviceLockAndPrompt()

O Windows Mobile, a partir da versão 6, disponibiliza uma chamada de função que permite bloquear o dispositivo via código, a SHDeviceLockAndPrompt. Ela está presente também em algumas versões anteriores, caso o fabricante tenha optado por incluir tal funcionalidade na imagem do sistema. No entanto, como a maioria das operações mais específicas e pouco utilizadas, essa função está disponível apenas nas bibliotecas nativas do Windows (C/C++).

Para podermos utilizar tal funcionalidade no projeto C#, precisamos primeiro declarar um método com uma assinatura que possa ser traduzida para a função original. Esse novo método será o responsável por fazer a comunicação com o código nativo diretamente. O mecanismo acima é conhecido por “Platform Invoke”, ou apenas P/Invoke. Não será necessário conhecer profundamente P/Invoke para um entendimento completo desse artigo, mas se você quiser saber mais, veja um tutorial explicativo no site MSDN.

Na documentação da Microsoft sobre a função mencionada anteriormente, podemos ver que a biblioteca a ser referenciada, para podermos chamar o método via .NETCF, é a “Aygshell.dll”:

Requisitos da função SHDeviceLockAndPromptA declaração do método no nosso código C# poderá ser feita de 2 formas, a primeira com o mapeamento mais comum:

[DllImport("aygshell")]
private static extern int SHDeviceLockAndPrompt();

E a segunda, com um recurso de tradução de resultados para exceções automaticamente:

[DllImport("aygshell", PreserveSig = false)]
private static extern void SHDeviceLockAndPrompt();

Essa segunda forma pode ser preferível se o contexto que a usa já estiver tratando exceções e esse for o meio comum de tratamento de erros usado no seu sistema.

Estamos Prontos para Bloquear o Dispositivo?

Para bloquearmos o dispositivo, usaremos a função definida acima. No entanto, isso não é suficiente. Não comentamos nada a respeito de como modificar a senha de desbloqueio! Usando a API do Android, é possível alterar diretamente todas as restrições sobre a senha e atribuir uma nova senha, antes do bloqueio. Infelizmente, esse procedimento não pode ser mapeado diretamente para o WM. Apesar de existirem métodos específicos para verificar (CheckPassword()) e modificar (SetPassword()) a senha atual, é impossível fazer alterações sem saber qual a senha corrente no dispositivo (note que a função “SetPassword” recebe a senha antiga e falha caso ela esteja incorreta).

A única maneira que temos para assegurar o bloqueio completo do dispositivo (com as garantias que o sistema nos oferece), e poder atribuir uma senha qualquer para o desbloqueio, é reimplementar o sistema de autenticação do Windows Mobile.

Sobre essa constatação, temos um ponto positivo e um (ou diversos…) negativos.

Primeiro o positivo:

O LASS (Local Authentication SubSystem), responsável por controlar as verificações de usuário e o bloqueio do dispositivo, nos permite “trocar” o aplicativo que interage com o usuário. Assim, poderemos criar nossa própria aplicação e tratar da maneira que for mais conveniente o problema da senha e da interface! Basta armazenar a senha em um local seguro e a ler durante a verificação de desbloqueio. Dessa forma, é possível um software externo saber como e onde armazenar essa senha e, após alterá-la, chamar diretamente o método SHLockAndPrompt. Seguindo esses passos, o sistema será bloqueado e o nosso tratador terá o controle sobre o desbloqueio.

E, sobre o ponto negativo principal:

Esse novo programa, que substituirá o original, necessariamente precisa ser feito em código nativo do dispositivo.

Essa restrição existe pois os módulos necessários para carregar com sucesso uma aplicação .NET não estarão ainda em memória, dependendo do contexto em que o nosso autenticador for chamado. Por exemplo, se bloquearmos o dispositivo e em seguida fizermos um soft reset, o sistema se encarregará de manter a informação de que todo o sistema está bloqueado, e a primeira aplicação a ser carregada no novo boot será a nossa. Além desse problema, existe ainda uma segunda restrição para dlls feitas em C#, que é a impossibilidade de exportação de métodos como são feitas as dlls em C.

Sabendo disso, passaremos agora para a próxima sessão, que trata da criação desse “plugin” de autenticação.

Criando um LAP

“LAP”, sigla de Local Authentication Plugin, é o nome criado pela Microsoft para esse software que gerencia as autenticações de usuário. O conceito de um plugin customizado foi criado para que empresas diversas pudessem manter seus próprios mecanismos de autenticação, sem serem limitadas pelo sistema padrão. É possível, por exemplo, criar suporte para identificação biométrica, autenticação via smartcards, etc. Nosso intuito aqui é muito mais singelo: usaremos apenas parte do potencial de um LAP para bloquearmos o dispositivo.

Como descrito na documentação referenciada no parágrafo anterior, o LAP é uma dll (e não um código executável), que deve implementar algumas funções específicas. O detalhe é que essas funções nunca serão diretamente chamadas pelo nosso código. Elas são acessíveis apenas pelo LASS, e qualquer ação que quisermos tomar sobre o LAP deve ser direcionada ao LASS. A função que usaremos, SHDeviceLockAndPrompt, faz justamente isso: pede ao LASS para interagir com o LAP, bloqueando o dispositivo.

Como o LAP acaba sendo muito mais complicado do que parece (diversos cuidados devem ser tomados para que não ocorram problemas que travem o sistema operacional ou, pior, permitam que o usuário saia do bloqueio indevidamente), tomaremos como base a aplicação demo da própria Microsoft, que acompanha o SDK do Windows Mobile 6. Os exemplos de LAPs podem ser encontrados nas subpastas Samples\PocketPC\CPP\win32\LAP e Samples\Smartphone\CPP\win32\LAP

Para começar a implementação, precisamos criar um projeto dll em C. Utilize sempre como referência as configurações da solução do LAP exemplo para fazer alterações. Algumas opções do projeto C são muito mais complexas que as dos projetos C#, e podem ter efeitos indesejados no código ou gerar problemas difíceis de rastrear.

Nosso arquivo .c principal conterá as funções necessárias para o funcionamento básico do LAP, e terá o seguinte esqueleto:

BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
    return TRUE;
}

BOOL InitLAP(InitLap* il)
{
    return TRUE;
}

void DeinitLAP() {}

BOOL VerifyUser(const GUID* AEKey, LPCWSTR pwszAEDisplayText, HWND hwndParent, DWORD dwOptions, PVOID Extended)
{
    return TRUE;
}

void VerifyUserStart(const GUID *AEKey, LPCWSTR pwszAEDisplayText, HWND hwndParent, DWORD dwOptions, PVOID pExtended) {}

void VerifyUserStop() {}

void VerifyUserToTop() {}

BOOL LAPCreateEnrollmentConfigDialog(HWND hwndParent,DWORD dwOptions)
{
    return TRUE;
}

Além desse arquivo de código principal, é preciso criar um segundo arquivo, .def, que contém quais métodos da dll gerada serão efetivamente exportados e poderão ser acessados por outros módulos (no caso do LAP, apenas o LASS). Arquivos .def são uma das diversas maneiras de exportar funções de uma dll em C. Para saber mais consulte a referência na MSDN. Nosso arquivo .def tera a seguinte forma:

EXPORTS
VerifyUser
LAPCreateEnrollmentConfigDialog
InitLAP
DeinitLAP
VerifyUserStart
VerifyUserStop
VerifyUserToTop

Cada uma dessas funções tem uma finalidade bem específica. Em resumo, o que se espera de cada uma é:

  • InitLAP: inicializações de variáveis globais e estados do LAP devem ser feitas aqui, pois essa função roda apenas uma vez no carregamento da dll.

 

  • DeinitLAP: similarmente, essa função é chamada apenas uma vez quando a dll do LAP é descarregada do sistema, e deve ser usada para limpezas finais.

 

  • LAPCreateEnrollmentConfigDialog: chamada quando existe uma requisição para a troca das configurações do LAP pelo usuário. Um exemplo simples é o que acontece ao se entrar no menu de configurações do sistema e selecionar Senha. Uma chamada a essa função deve apresentar uma janela com as opções de senha e armazenar as definições em um local acessível pelo restante do LAP. Essa funcionalidade não é necessária no escopo do lock, já que o usuário não deve poder configurar o LAP diretamente.

 

  • VerifyUserStart: chamada uma vez antes de uma ou mais chamadas sequenciais de VerifyUser. É um bom ponto para criar a janela de verificação e inicializar seus campos.

 

  • VerifyUser: chamada quando existe uma verificação de senha a ser feita. Pode ser feita pelo sistema (comumente depois de um certo período de inatividade) ou por código via chamada ao LASS da função de mesmo nome, VerifyUser. Como dito anteriormente, não esqueça que é proibido chamadas diretas ao LAP, e essa nova função é uma redireção do LASS. A documentação dessa função se encontra aqui. É importante levar em conta que esse método do LASS não bloqueia o aparelho, mas sim requisita uma autenticação, que pode ser usada pelo software chamador para prosseguir numa ação ou não, dependendo do retorno.

 

  • VerifyUserStop: da mesma forma que VerifyUserStart, essa função é executada ao término de uma ou mais tentativas consecutivas de verificação. Usada principalmente para limpar as estruturas criadas em VerifyUserStart.

 

  • VerifyUserToTop: função auxiliar do LAP, chamada automaticamente para forçar a exibição da tela de verificaçao. É importante que essa funcionalidade seja implementada corretamente para que a interface do usuário não fique bloqueada por uma autenticação pendente em segundo plano. Isso pode ocorrer em algumas situações especiais, como autenticações múltiplas sendo requisitadas ao LAP em pequenos intervalos de tempo.

 

A criação da interface e o código necessário para se chegar nas funcionalidades acima não fazem parte do escopo desse artigo, e envolvem uma série de conceitos relativamente complexos, como a API de mensagens do Windows usada para fazer as interações entre os controles (um bom ponto de partida é esse artigo na MSDN) e a CryptoAPI, usada para armazenar informações sensíveis como senhas no registro (referência). Lembre-se de sempre se basear no código de demonstração quando estiver utilizando essas bibliotecas, pois ele utiliza tanto a API de mensagens quanto a CryptoAPI em diversos pontos do código.

Um detalhe que pode comprometer a segurança do LAP e provocar falhas de usabilidade é o estilo das janelas criadas, por exemplo, que deve conter a flag que indica execução acima do startup. O arquivo de recurso (.rc) da aplicação demo mostra isso claramente:

Navengando para o código dos recursos

IDD_VERIFY DIALOG  0, 24, 130, 120
STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_BORDER
EXSTYLE 0x60000000L
BEGIN
    LTEXT           "Enter your password and tap OK.",IDC_VERIFY,8,6,124,33
    CONTROL         "",IDC_PASSWORD,"sbedit",WS_BORDER | WS_TABSTOP | 0xa0,8,42,124,13
    CONTROL         "",IDC_EMERGENCY,"sbedit",NOT WS_VISIBLE | WS_BORDER | WS_TABSTOP | 0x2080,8,42,124,13
    LTEXT           "",IDC_INFO,8,60,124,100,SS_NOPREFIX
END

Com esse pequeno subconjunto de funções do LAP (existem ainda diversas outras funções opcionais a serem implementadas que não foram mencionadas aqui, consulte aqui), já é possível comerçar os testes! Basta compilarmos o projeto, e substituirmos a dll do LAP original pela nossa. Mas como fazemos isso?

Substituindo o LAP Padrão

O LASS, além de intermediar toda a comunicação com o LAP, controla qual dos LAPs está ativo em um dado momento no sistema. Sim, é possível ter diversos LAPs simultaneamente no sistema de arquivos e carregá-los independentemente um do outro. Para fazer isso, é necessário mais um passo de configuração, que é a edição do registro do Windows. Assume-se que um desenvolvedor em busca de uma solução avançada como o lock no Windows Mobile saiba que edições no registro podem corromper todo o sistema, mesmo assim vale o alerta: modifique apenas as configurações presentes nesse artigo, sob risco de danificar o sistema operacional!

Para funcionar, cada LAP deve ter uma entrada própria (uma chave) no registro, em HKEY_LOCAL_MACHINE\Comm\Security\LASSD\LAP. Para os testes, podemos criar uma chave com o nome “LAPDemo”, na chave LAP.

Com a chave criada, precisamos de um valor string, que apontará para nossa dll. Crie um valor com o tipo string (REG_SZ), com nome “Dll” e coloque como dado o caminho completo de onde deseja colocar a dll. Note que se ela estiver na pasta windows, será necessário apenas incluir o nome da dll (o lap padrão, por exemplo, fica na pasta windows).

A estrutura nesse ponto deve ser a seguinte:
Configurações do LAP no registro

Note na imagem acima que existe uma segunda chave já cadastrada, “lap_pw”. Cada entrada na chave pai LAP é um LAP instalado no sistema, e lap_pw é o LAP default.

Após criar a nossa chave customizada, precisamos agora dizer ao sistema qual LAP deve ser carregado. Para fazer isso, observe o valor “ActiveLAP” na chave LAP. O dado armazenado nesse valor diz qual LAP está sendo usado especificando o nome da chave do LAP. Ao trocarmos o lap_pw por LAPDemo, estamos dizendo ao sistema para, na próxima atualização do plugin, carregar o nosso autenticador.

Configuração do LAP Ativo no registro

O Windows carrega o LAP toda vez que o sistema é reiniciado ou, alternativamente, após a chamada de uma outra função, LASSReloadConfig. A documentação dessa nova função pode ser encontrada aqui. A exemplo da nossa função de bloqueio, LASSReloadConfig também é uma função nativa sem equivalente no .NetCF, portanto precisamos novamente usar P/Invoke para usá-la:

[DllImport("coredll")]
private static extern bool LASSReloadConfig();

Sobre a assinatura do LAP

Um outro fator que compromete o funcionamento do LAP, e que ainda não foi mencionado, é a necessidade de assinatura do arquivo gerado (.dll) por um certificado presente no dispositivo. Não somente isso, mas o certificado deve estar presente no certificate store “Privileged Execution Trust Authorities”.

Uma das maneiras de instalar um certificado nesse certificate store do dispositivo é criando um xml-provisioning doc com as informações necessárias e enviar diretamente via código ou através de um arquivo .cab. Para saber mais sobre a API de configuração via arquivos xml consulte a referência na MSDN. A estrutura de um xmldoc com as configurações de um certificado é a seguinte:

<wap-provisioningdoc>
    <characteristic type="CertificateStore">
        <characteristic type="Privileged Execution Trust Authorities">
            <characteristic type=<thumbprint_certificado>
                <parm name="EncodedCertificate" value=<base64_certificado>/>
            </characteristic>
        </characteristic>
    </characteristic>
<wap-provisioningdoc>

Para obter o valor de cada um dos 2 campos (thumbprint e valor codificado em base64) é preciso ter acesso ao certificado no sistema. Vá em executar, digite “certmgr.exe” e tecle enter. Encontre o certificado desejado e dê um duplo clique sobre ele. O thumbprint pode ser encontrado na listagem de parâmetros. Copie-o para o local indicado no xml.

Thumbprint do certificado

O valor do certificado codificado em base64 pode ser obtido exportanto o certificado para um arquivo .cer. Para fazer isso, clique em “Copy to File” na janela de propriedades do certificado e siga as instruções até alcançar a janela de formato, selecionando “Base64 encoded x.509″:

Exportando o certificado com codificação Base64

Salve o arquivo gerado em um lugar de sua escolha e abra-o com um editor de texto. O valor mostrado entre as tags “—–BEGIN CERTIFICATE—–” e “—–END CERTIFICATE—–” deve ser copiado para a posição indicada no xml.

O arquivo assim gerado pode ser usado diretamente para instalar o certificado no dispositivo.

O processo para assinar uma dll C com um certificado presente na estação de desenvolvimento é bem simples. Basta entrar nas propriedades do projeto, selecionar “Authenticode Signing”, ativar a assinatura e finalmente escolher um certificado, como mostra a figura abaixo:

Assinando um projeto dll C

Antes de copiar a dll para o dispositivo, é interessante testar a sua validade pela ferramenta “Security Configuration Manager”, que pode ser encontrada aqui. Ela permite visualizar os certificados instalados no dispositivo, e ainda verificar a compatibilidade das assinaturas de um arquivo com o dispositivo.

A imagem a seguir mostra como deve estar a situação da assinatura da dll do LAP:

Verificação de assinatura de arquivo no Security Configuration Manager

É imprescindível que a dll tenha a permissão “run pre-boot”, que é o nível máximo de acesso, para que possa funcionar corretamente quando o dispositivo é reiniciado. É também importante tomar cuidado com o fato de que a verificação feita por esse aplicativo não leva em conta as datas de validade dos certificados, apenas a sua presença. O certificado de desenvolvimento contido na SDK do Windows Mobile 6, por exemplo, já está expirado, e não servirá para testes a não ser que as datas do sistema, tanto na estação de desenvolvimento que assina a dll quanto no próprio dispositivo, sejam alteradas de acordo. Para obter um certificado mais recente (e as imagens dos emuladores com as instalações corretas) baixe a última versão do DTK (6.5.3) aqui.

Conclusão

Dependendo do nível de suporte e da generalidade da API que nos é oferecida, algumas tarefas podem ser muito mais complexas ou requerer um esforço maior de desenvolvimento do que outras. Nosso caso com o lock no WM, em comparação à implementação do Android, é nitidamente um exemplo disso. Todo o problema recai em estarmos usando uma API extremamente poderosa (mais até que as das outras plataformas) para usufruir de um pequeno conjunto de suas garantias (o bloqueio do dispositivo).

No entanto, para uma empresa que concentra seus esforços no desenvolvimento de soluções móveis, é extremamente importate conhecer os diversos recursos de cada uma de suas plataformas alvo. A possibilidade de criação de um LAP mais complexo certamente abre um leque de oportunidades que podem ser exploradas num futuro próximo.

Aqui encerra nossa série de artigos sobre lock e wipe em Windows Mobile! Obrigado aos que conseguiram acompanhar esse artigo. Esperamos que ele tenha sido útil de alguma forma, face à escassez de documentação sobre LAPs na internet.

Escrito por Juliano Gonçalves

Tecnologia Push em sistemas iOS e Windows Phone (Parte 2/2 – MPNS)

Na semana passada, nosso post abordou Tecnologia Push em sistemas iOS e Windows Phone. Para darmos continuidade, essa semana vamos conhecer como funcionam as notificações de push no novo sistema operacional mobile da Microsoft, o Windows Phone.

Vamos dar uma passada por todo o ciclo dessa infraestrutura!

Pré-requisitos e Infraestrutura

As notificações de push no Windows Phone podem ser testadas no emulador, dispensando a aquisição de uma licença de desenvolvedor. Entretanto, para uso no dispositivo, é necessário realizar o processo de cadastramento do aparelho no APP HUB da Microsoft. Nesse momento, focaremos nosso exemplo no uso do emulador.

Com esse cenário, também será necessário um servidor ou provider como citado na parte 1 desse post [veja o post], aqui chamado de cloud service.

No Windows Phone, o processo de comunicação entre cloud service e MPNS é bem mais simples. A conexão com o servidor de notificações da Microsoft é feita via HTTP.

Diferentemente do iOS, na plataforma da Microsoft, o cloud service não precisará de um certificado para estabelecer a conexão com o MPNS.

O processo básico desse cenário é o seguinte:

  • No dispositivo, a aplicação com notificações de push ativado estabelece uma conexão com o MPNS via HTTP e recebe um token.  (etapas 1 e 2)
  • Esse token será informado pelo dispositivo ao cloud service. Uma vez atualizado o token no cloud service, o ciclo está completo e as notificações de PUSH podem ser enviadas.
    (etapas 3 e 4)
  • O cloud service envia as notificações de push para o MPNS e esse, por sua vez, analisa o token e encaminha para o respectivo dispositivo. No dispositivo interpreta-se a notificação e toma as ações desejadas.
    (etapas 5 e 6)

Na estrutura desse token existe o endereço para o qual o cloud service deverá fazer a requisição HTTP e o identificador do dispositivo.

Recebendo uma notificação

Existem três tipos de notificações que podem ser enviadas ao dispositivo, cada uma com sua finalidade específica.
São elas RAW, TILE e TOAST.

TILE MESSAGE:

São usadas para atualizar informações de aplicações que estão em PIN (na área de trabalho) do dispositivo. Pode-se atualizar a imagem ou valores da TILE.

Vamos exemplificar com uma aplicação para leitura de RSS. Toda vez que novas notícias estão disponíveis a aplicação pode atualizar a TILE via notificações de push, mostrando quantas novas existem.
Não nos aprofundaremos nesse tipo de mensagem pois vamos dar foco à TOAST MESSAGE.

RAW MESSAGE:

Mensagens que chegam silenciosamente ao dispositivo. Imperceptível ao usuário, só será processada se a aplicação estiver em execução, caso contrário é descartada.

TOAST MESSAGE:

Se a sua aplicação não está em execução, será exibida uma mensagem de alerta no topo da tela do dispositivo informando o recebimento da notificação. O usuário pode tocar na alert bar para que a aplicação seja executada e a notificação processada.

Caso transcorram alguns segundos sem que o usuário toque na alert bar, a notificação será descartada.
Se a aplicação já estiver em execução, a notificação é recebida sem o alerta na alert bar e é imediatamente processada sem necessidade de intervenção do usuário.

 Abaixo segue trecho do método responsável pela construção da mensagem e envio:

...
//token recebido anteriormente na abertura do canal do dispositivo com MPNS
string subscriptionUrl = _token;

//criando mensagem associando ao token
HttpWebRequest sendNotificationRequest  = (HttpWebRequest)WebRequest.Create(subscriptionUrl);

//cabeçalho da mensagem
sendNotificationRequest.Method = "POST";
sendNotificationRequest.ContentType = "text/xml";
byte[] notificationMessage = new byte[] { };

//chamada do método que constrói mensagem do tipo TOAST
notificationMessage = TOASTMESSAGE(_text1, _text2);

//solicita entrega imediata
sendNotificationRequest.Headers.Add("X-NotificationClass", "2");

//informa o tipo de notificação
sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");

//informa tamanho da mensagem
sendNotificationRequest.ContentLength = notificationMessage.Length;

//preparando mensagem para envio
using (Stream requestStream = sendNotificationRequest.GetRequestStream())
{
    requestStream.Write(notificationMessage, 0, notificationMessage.Length);
}

//envio da notificação
HttpWebResponse response =
    (HttpWebResponse)sendNotificationRequest.GetResponse();

//conferindo resposta do envio
string notificationStatus = response.Headers["X-NotificationStatus"];
string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];
...

Estrutura de uma mensagem do tipo TOAST:

<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
    <wp:Toast>
        <wp:Text1>{0}</wp:Text1>
        <wp:Text2>{1}</wp:Text2>
    </wp:Toast>
</wp:Notification>

* Onde {0} = header e {1} = payload
** O tamanho máximo para o header é de 1 kb e o payload 3 kb. Mensagens com tamanho superior serão simplesmente descartadas.

Conclusões

É notável que o processo para envio das notificações de push é muito mais simples no Windows Phone, todavia, muito se assemelha ao iOS.
O entendimento de todo o cenário de funcionamento do mecanismo de PUSH é crucial para o seu desenvolvimento e facilita o processo de implementação.

Intrínsecas funcionalidades de MDM (Mobile Device Management) não estão disponíveis na versão do Windows Phone 7, o que acaba sendo um pouco frustrante.

Além disso, a limitação para processar notificações recebidas apenas por aplicações em execução em primeiro plano, também deixam a desejar e tornam a realidade do MDM um pouco distante do ideal, se comparado ao antigo Windows Mobile.

Nesse caso, todo o foco das notificações de push ficam atreladas apenas às aplicações que estão em execução. Por tratar-se de um sistema operacional novo, aguardamos por novidades nas próximas versões.

Por enquanto, jogamos com as cartas da mesa para expor tudo que é possível até o momento, na esperança de que, logo ali na frente, as novidades cheguem e possamos ir mais além!

Participe de nosso blog deixando comentários com sugestões, dúvidas, análises.

Abraço e até o próximo post!

Escrito por Luiz Roberto Lethang Rodolpho

Tecnologia Push em sistemas iOS e Windows Phone (Parte 1/2 – APNS)

Você já viu aqui no blog como a tecnologia Push pode ser implementada em dispositivos que permitem que uma aplicação execute em background sem restrições. Na verdade, existem várias formas de se prover comunicação em tempo real em aplicações de mobilidade do tipo cliente-servidor. A mais recente tendência em sistemas móveis é a disponibilização de uma infraestrutura nativa à plataforma que possibilite o desenvolvimento de aplicações com essa característica. Essa tecnologia se baseia em um serviço disponibilizado na nuvem pelo fabricante do sistema operacional onde um servidor, chamado de provider, pode se conectar e enviar as notificações que deseja entregar, e a entrega ao dispositivo fica a cargo do servidor do fabricante. Atualmente, a Apple, desde o iOS 3, e a Microsoft, desde o Windows Phone 7, disponibilizam serviços deste tipo, chamados respectivamente de Apple Push Notification Service (APNS) e Microsoft Push Notification Service (MPNS). Neste post vamos abordar as infraestruturas de Push da Apple e da Microsoft, desde os pré-requisitos até a forma de tratar as notificações no dispositivo. Nesta primeira parte vamos falar do APNS, e a segunda tratará do MPNS.

Pré-requisitos e Infraestrutura

Se você conhece as necessidades para se tornar um desenvolvedor no mundo Apple, já deve conhecer os developer programs, e como eles afetam as suas possibilidades como desenvolvedor (confira as características do desenvolvimento em iOS em nosso comparativo com a plataforma Android, em breve dedicaremos um post para explicar as diferenças entre cada programa de desenvolvimento da Apple). Ainda não é possível receber uma notificação pelo simulador, o que já exige no mínimo a licença paga de desenvolvedor (U$99 ao ano), pois será preciso testar em um dispositivo (um iPod é suficiente). Também é preciso ter um servidor para atuar como provider. Existem serviços pagos na internet que disponibilizam essa função, ou é possível desenvolver o seu próprio provider. O M3, solução da Mobiltec para integração em mobilidade, já possui a capacidade de atuar como provider tanto para APNS quanto para MPNS.

Como funciona o APNS

A conexão com o servidor de notificações da Apple é feita através de sockets TCP utilizando TSL. Pode parecer estranha a escolha por um protocolo de mais baixo nível, ao invés de utilizar HTTP por exemplo, como no caso do serviço da Microsoft, mas certamente o desempenho foi um fator crucial nessa decisão, já que o serviço concentra todas as notificações para dispositivos iOS no mundo, o que não é pouca coisa. O certificado para que o provider consiga se conectar ao APNS é obtido no portal de desenvolvedores da Apple. Para cada aplicação que receberá notificações há um certificado específico, que será utilizado para abrir a conexão para esta aplicação. O certificado contém o bundle (identificador padrão de aplicativos iOS) e assim o APNS já sabe para qual aplicativo deve entregar a notificação. Falta ainda para o serviço saber para qual dispositivo deve entregar a notificação. Essa identificação é feita através do push token, um identificador único por dispositivo que é obtido pelo aplicativo no aparelho e enviado ao provider. Com estas duas informações já é possível para o APNS rotear a notificação para o par exato de aplicação/dispositivo que irá recebê-la.

“Mas como é esta notificação afinal, e como as informações são passadas?” você deve estar se perguntando. As notificações são pacotes de no máximo 256 bytes cada, e podem ser montadas em dois formatos: simple e enhanced.

Este é o pacote no formato enhanced, que se diferencia do formato simple apenas pela presença de dois campos extras: expiry, que define por quanto tempo o APNS deve tentar enviar a notificação até desistir se não conseguir entregá-la, e identifier, que serve para o provider saber quais notificações não foram aceitas pelo APNS devido a algum erro, como um pacote mal formado ou maior que o limite, por exemplo. Essa informação é passada como resposta ao envio de um conjunto de notificações, no formato da figura abaixo, onde uma resposta é gerada para cada notificação com erro. Se nenhum erro ocorreu, o serviço simplesmente não responde nada.

Os outros campos que formam uma notificação são o command, que indica se é uma notificação no formato simple (0) ou enhanced (1), o token que foi enviado pelo dispositivo e seu tamanho, e o payload e seu tamanho. O payload é onde as informações que serão passadas ao dispositivo são armazenadas. Ele usa o formato JSON, que basicamente codifica um dicionário.

O mínimo que este dicionário deve conter é a chave “aps” com um dicionário como valor. Este dicionário da chave “aps” deve conter no mínimo uma das três formas de notificação: alert, badge ou sound. Opcionalmente podem ser passadas informações personalizadas referentes a lógica da aplicação, criando-se um ou mais dicionários, desde que não seja excedido o limite de 256 bytes para a notificação como um todo. Apesar de ser possível o envio de dados pela notificação, esses dados não devem cruciais para o funcionamento da aplicação, já que a política do APNS é “best effort”, e a entrega da notificação não é garantida. A função principal da notificação é avisar a aplicação para que ela se conecte ao seu provider e realize alguma tarefa.

O serviço da Apple é dividido em dois servidores: um de teste, acessado através do endereço gateway.sandbox.push.apple.com, porta TCP 2195, que deve ser utilizado durante a fase de desenvolvimento da aplicação, e o servidor de produção, conectado através do endereço gateweay.push.apple.com, porta TCP 2195. Este último possui políticas mais severas quanto ao bom uso dos recursos que devem ser seguidas pelo provider. Os servidores da Apple monitoram a forma como os providers utilizam o serviço. Se um provider abrir várias conexões com muita frequência, pode ter seu acesso bloqueado. Por isso, a recomendação é de que as notificações sejam agrupadas sempre que possível para envio, e que a conexão seja mantida aberta o maior tempo possível. Além disso, o APNS disponibiliza um serviço de Feedback, que os providers podem (e devem) consultar periodicamente para obter uma lista de dispositivos com os quais o APNS repetidamente não conseguiu se conectar. Isso evita que se tente enviar notificações para dispositivos que não podem mais recebê-las, pelo usuário ter removido a aplicação por exemplo, evitando o desperdício de recursos do serviço.

Recebendo uma notificação

Finalmente você consegue fazer uma notificação chegar ao dispositivo, mas ainda é necessário receber e processar as informações que chegaram. Até o iOS 4.x, existiam três possibilidades de recebimento de notificações do ponto de vista da aplicação: a notificação era recebida em um momento que a aplicação já estava rodando, e o processamento poderia ser feito de forma transparente ao usuário, a noticação chegava enquanto a aplicação não estava rodando, com o usuário aceitando esta notificação, fazendo com que a aplicação seja iniciada, ou, neste mesmo caso, o usuário recusava a notificação, e ela não seria entrege, não sendo possível recuperar as informações enviadas. Além de a entrega da notificação não ser garantida, mesmo após o recebimento no dispositivo, ainda não se pode ter certeza que a notificação chegará à aplicação. Isso é uma característica do sistema de notificações dos dispositivos iOS 4.x , oriunda da política de usabilidade e controle do usuário sobre o dispositivo adotada pela Apple, e a aplicação deve estar preparada para estes fatores e incertezas. O sistema de notificações, no que diz respeito à forma como elas são entregues, foi totalmente reformulado no iOS 5 (o serviço de PNS continua funcionando para quem já tinha notificações sendo entregues em versões anteriores do iOS sem necessidade de alterações segundo a Apple) mas isso será abordado em nossos próximos posts.

No caso da applicação ter sido iniciada devido a uma notificação de Push, as informações do payload podem ser recuperadas na classe AppDelegate, no método chamado ao iniciar uma aplicação, através do dicionário que este método recebe como parâmetro e da chave, que é uma constante do sistema, como mostra o trecho de código abaixo.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //...
    NSDictionary *remoteNotificationInfo = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    //...
} 

Se a aplicação já estiver rodando no momento que receber uma notificação, o AppDelegate deve ter a implementação do método abaixo.

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

Conclusões

Prover a funcionalidade de push em uma aplicação não é simples devido a todos os pré-requisitos, principalmente o de um servidor provider, que vai exigir algum esforço de programação ou o custo para usar um servidor pago. Além disso, usar essa tecnologia para aplicativos com funcionalidades de MDM é difícil devido a exigência de interação com o usuário no momento do recebimento das notificações e até a possibilidade de a notificação ser descartada. Mas nesse sentido, o conceito de MDM da Apple também é diferente, disponibilizando, assim como no caso do Push, uma infraestrutura específica. Mesmo o serviço de Push possui um tipo de notificação específica para MDM. Temos muitos assuntos interessantes para tratar sobre a plataforma iOS. Acompanhe o nosso blog que em breve teremos mais posts sobre tecnologias para iOS. E ainda essa semana teremos a segunda parte deste post, sobre a tecnologia de Push para plataforma Windows Phone. Aguarde!

Escrito por Renan Drabach

Referência
http://goo.gl/3ejZh