Setembro de 2016

Volume 31 – Número 9

Xamarin – Produtividade de Plataforma Cruzada com o Xamarin

Por Kevin Ashley | Setembro de 2016

Se você trabalha no Vale do Silício atualmente, notará que os investidores e desenvolvedores são geralmente conservadores sobre as tecnologias que utilizam. A maioria contrata primeiro um desenvolvedor de iOS, depois (se tiverem financiamento suficiente) um desenvolvedor de Android e/ou Windows. No entanto, essa abordagem é extremamente ineficiente porém resulta em códigos sendo reescritos: os desenvolvedores de iOS usam Objective-C, os desenvolvedores de Android usam Java e os desenvolvedores de Windows usam C#. Eles raramente conversam entre si, muito menos partilham o código e isso resulta em aplicativos inconsistentes entre as plataformas e, muitas vezes, num desperdício de milhões de dólares para suporte a branches e tecnologias de desenvolvimento completamente separadas umas das outras. Para uma estratégia de desenvolvimento eficaz e consistente, usar uma tecnologia de plataforma cruzada como o Xamarim é a chave para a produtividade. E, com o crescimento das tecnologias de compilação ahead-of-time (AOT) nativa que traduz linguagens de alto nível como C# de forma nativa para um código estático de plataformas nativas, o modelo de programação que exigia desenvolvedores de Android, iOS e Windows está se tornando uma coisa do passado.

Essa é uma nova direção para os aplicativos tradicionais, mas já se observa resultados positivos em outras áreas como a dos jogos eletrônicos, por exemplo. Por exemplo, mais de metade de todos os jogos 3D para iOS, Android e Windows são desenvolvidos com Unity. Ao criar jogos em Unity, você desenvolve usando principalmente C# em um subconjunto de Mono e isso não é diferente de usar C# com Xamarin. Os jogos Unity são executados em mais de 20 plataformas, incluindo Windows, Android, iOS, OS X, Xbox, Playstation, entre outros. Esse é um ótimo caminho a ser seguido para aplicativos não relacionados a jogos e o Xamarin oferece uma excelente plataforma para isso.

A mesma abordagem pode ser usada para outros aplicativos e não apenas jogos? Com o Xamarin, você pode: Eu o usei para criar o Active Fitness, uma plataforma para exercícios físicos baseada na nuvem com mais de dois milhões de usuários em todo o mundo (activefitness.co). Eu comecei a usar o Xamarin logo no início do ciclo de desenvolvimento, começando com as primeiras versões e consegui criar uma solução de plataforma cruzada para Windows, iOS e Android, baseada na nuvem do Microsoft Azure. O Active Fitness, mostrado na Figura 1, apresenta mais de 90 porcento do código compartilhado entre os seus aplicativos nativos de iOS, Windows e Android. Isso por si só já é um ganho de produtividade. Além disso, a maior parte do Xamarin, incluindo o Xamarin.Forms (bit.ly/2a8Yo4g), é de software livre. A plataforma possui um grande suporte da comunidade e o desempenho é idêntico ao código nativo, graças ao suporte para AOT nos sistemas integrados. Além disso, o Xamarin está incluído no Visual Studio sem custos adicionais, incluindo a Community Edition gratuita.

Active Fitness em Ação, Demonstrando Mapas em 3D e a Rica Interface do Usuário
Figura 1 Active Fitness em Ação, Demonstrando Mapas em 3D e a Rica Interface do Usuário

Aspectos do Design de Aplicativos de Plataforma Cruzada com o Xamarin

Há alguns anos atrás, o design dos aplicativos móveis era completamente diferente em cada plataforma. Um aplicativo para iOS, por exemplo, não era nem um pouco parecido com um aplicativo para Android ou Windows em relação ao design. Esse não é mais o caso. Atualmente, a maioria dos aplicativos modernos para Windows, Android e iOS utilizam conceitos e paradigmas de design similares. O que aconteceu? A Microsoft criou uma linguagem de design moderno usada pelos aplicativos usada pela Plataforma Universal do Windows (UWP). O Google inventou o design Material e a Apple introduziu um design com uma aparência mais moderna para o OS. Todas essas alterações feitas no iOS, Android e Windows se comportam de forma parecida e são visualmente mais semelhantes, simplificando o trabalho dos desenvolvedores (consulte a Figura 2). Os desenvolvedores usam até fontes icônicas, como Font Awesone, que utilizam conceitos icônicos semelhantes para ações em várias plataformas. As plataformas ainda possuem diferenças visuais, naturalmente, por exemplo, o Windows inclui os blocos em tempo real. Mas, surpreendentemente, se você criar um aplicativo de plataforma cruzada, fica fácil adicioná-los uma vez que o núcleo está lá.

Active Fitness no Windows (Esquerda), Android (Meio) e iOS (Direita)
Figura 2 Active Fitness no Windows (Esquerda), Android (Meio) e iOS (Direita)

Ao desenvolver com Xamarin você possui a capacidade de criar uma bela interface do usuário para cada plataforma diretamente do Visual Studio. Isso significa usar os storyboards do iOS, o XML do Android e o XAML do Windows com acesso a todos os controles ou widgets e um grande número de controles personalizados para fornecedores. Além disso, o Xamarin oferece 100 porcento de acesso à API totalmente em C# para cada plataforma.

Com a biblioteca Xamarin.Forms que oferece uma abstração de API para criar uma interface do usuário compartilhada, muitos conceitos de design são movidos automaticamente para controles nativos para cada plataforma através dos renderizadores personalizados do Xamarin, oferecendo também a capacidade de personalizar um controle de plataforma cruzada para sua representação nativa em cada plataforma. Dessa forma, você tem a vantagem da produtividade de um verdadeiro aplicativo de plataforma cruzada e possibilidades de personalização ilimitadas!

Um grande benefício de usar o Xamarin.Forms é que ele é apenas um complemento, uma biblioteca que você adiciona ao seu projeto. Em termos de produtividade e de gerenciamento do ciclo de vida do seu aplicativo, isso é inestimável pois você pode criar um código que não depende muito dos ciclos de versão da plataforma que normalmente são muito mais lentos. O Xamarin sempre teve compatibilidade atualizada com as principais versões do iOS, Android e Windows e agora que é de software livre, caso precise adicionar um controle ao Xamarin.Forms, você pode sempre fazê-lo sozinho consultando o código-fonte ou participando do repositório do GitHub para Xamarin.Forms. O Xamarin também oferece opções de extensibilidade quase ilimitadas através dos renderizadores de controle personalizado para plataformas nativas. Se já possuir um aplicativo XAML, você está com sorte pois o Xamarin.Forms é apenas um dialeto do XAML e se seu aplicativo já usa Silverlight, UWP ou XAML. Você pode facilmente adicionar um complemento de plataforma cruzada no iOS ou no Android.

Criação da Navegação Master-Detail com Xamarin

Vamos dar uma olhada na vantagem de usar o Xamarin ao focar em um exemplo: um aplicativo comum no iOS, Android e Windows contendo um padrão de navegação master-detail (ou “hambúrguer”) a partir do repositório de exemplos do Xamarin de software livre (bit.ly/29Tk9VJ). Se você escrevesse esse aplicativo da mesma forma que os desenvolvedores de iOS, Android e Windows escrevem, você acabaria ficando com três projetos separados em Objective-C, Java e C# e teria que usar controles diferentes para cada um: o SplitView no Windows e padrões semelhantes no iOS e Android. Em vez disso, você pode usar uma única instância do Xamarin.Forms para fazer todo o trabalho duro para todas as plataformas, conforme mostrado na Figura 3.

Projeto Master-Detail do Xamarin com Destinos no Android, iOS e Windows
Figura 3 Projeto Master-Detail do Xamarin com Destinos no Android, iOS e Windows

No arquivo App.cs do projeto portátil, eu crio uma instância da página raiz do aplicativo:

public App ()
{
  MainPage =
    new MasterDetailPageNavigation.
    MainPage ();
}

Observe que a maior parte do código está em um projeto portátil, compartilhado entre todos os OSes e além disso, você pode usar XAML no Xamarin.Forms. O XAML na Figura 4 provavelmente parece muito simples se você já conhece o controle SplitView nativo do UWP.

Figura 4 Criação da Página Master-Detail Usando XAML

<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="https://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MasterDetailPageNavigation;assembly=MasterDetailPageNavigation"
x:Class="MasterDetailPageNavigation.MainPage">
  <MasterDetailPage.Master>
    <local:MasterPage x:Name="masterPage" />
  </MasterDetailPage.Master>
    <MasterDetailPage.Detail>
      <NavigationPage>
        <x:Arguments>
        <local:ContactsPage />
        </x:Arguments>
      </NavigationPage>
    </MasterDetailPage.Detail>
</MasterDetailPage>

O Xamarin oferece bastante flexibilidade em termos do que os desenvolvedores podem fazer com compilação condicional e seleção de plataforma. O código a seguir altera o ícone da página mestra se a plataforma for Windows:

if (Device.OS == TargetPlatform.Windows)
{
  Master.Icon = "hamburger.png";
}

Código Específico do Dispositivo e Xamarin

Até agora tudo bem, mas posso mesmo me aproximar da plataforma física no meu código Xamarin? Em outras palavras, posso diferenciar um código criado para diferentes tipos de dispositivos? Felizmente, o Xamarin é uma das poucas tecnologias de plataforma cruzada compatível com codificação nativa e acesso pela API. Semelhante aos aplicativos UWP que permitem diferenciar a família do dispositivo (telefone, tablet ou desktop), o Xamarin contém um seletor Device.Idiom muito útil, conforme mostrado na Figura 5.

Figura 5 Usando o Device.Idiom para Selecionar a Plataforma

switch (Device.Idiom)
  {
  case TargetIdiom.Phone:
    heading.Text += " Phone ";
    break;
  case TargetIdiom.Tablet:
    heading.Text += " Tablet ";
    break;
  case TargetIdiom.Desktop:
    heading.Text += " Desktop ";
    break;
  default:
    heading.Text += " unknown ";
    break;
  }

A Figura 6 mostra outro seletor muito útil, o Device.OnPlatform, que pode ser usado no code-behind e no seu XAML para executar diferentes ações dependendo do SO de destino.

Figura 6 Usando o Device.OnPlatform para Diferentes Plataformas como Destino

// Device.OnPlatform (Action)
//
var box = new BoxView {
  Color = Color.Green,
  WidthRequest = Device.OnPlatform (30, 40, 50),
  HorizontalOptions = LayoutOptions.Center
};
Device.OnPlatform(
  iOS: () =>{
    box.Color = box.Color.MultiplyAlpha(0.5);
    heading.TextColor = Color.Blue;
  },
  Android: () =>{
    box.Color = box.Color.AddLuminosity(0.3);
    heading.TextColor = Color.FromRgb(115, 129, 130);
  },
  WinPhone: () =>{
    box.Color = box.Color.AddLuminosity(0.3);
    heading.TextColor = Color.Accent;
  },
  Default: () =>{
    heading.Text = "what platform is this?!" + Device.OS;
  }
);

No XAML, o Xamarin adiciona marcações OnPlatform compatíveis com diferentes plataformas, por exemplo:

<Button Text="Start Timer"
  Clicked="TimerClicked"
  BackgroundColor="Gray"
  HorizontalOptions="Center">
  <Button.WidthRequest>
    <OnPlatform x:TypeArguments="x:Double"
      iOS="200"
      Android="300"
      WinPhone="100" />
  </Button.WidthRequest>
</Button>

Mas, e seu eu quiser personalizar um controle fornecido pelo Xamarin.Forms em uma plataforma nativa? Mencionei anteriormente que o Xamarin possui os chamados renderizadores personalizados que oferecem essa flexibilidade. Os renderizadores personalizados são classes que você pode extrair de objetos integrados e oferecer funcionalidade em implementações específicas para uma plataforma. Digamos que quero criar meu próprio controle CustomMap:

public class CustomMap : Map
  {
    public List<CustomPin> CustomPins { get; set; }
  }

Em uma plataforma nativa, a assinatura do meu objeto incluiria o seguinte:

[assembly:ExportRenderer (typeof(CustomMap), typeof(CustomMapRenderer))]

Então, no Android, iOS e Windows, posso sempre personalizar a aparência e a experiência do meu controle de mapa. O interessante é que o wrapper para o controle de mapa do Xamarin encapsula o controle de mapa do Windows no Windows, o Google Maps no Android e o controle de mapas nativo do iOS no iOS. O que mais posso personalizar com os renderizadores personalizados? Praticamente qualquer tipo de controle! O controle de mapa é um exemplo relativamente sofisticado, mas você também pode personalizar botões, rótulos, controles deslizantes ou qualquer controle disponível no Xamarin.Forms.

Com o Xamarin.Forms 2.2, o Xamarin agora inclui incorporação nativa que permite adicionar qualquer controle nativo a um aplicativo Xamarin.Forms (bit.ly/29IEvxH).

Acessando a Nuvem a partir do Xamarin

O Azure sempre foi compatível com plataformas cruzadas, com uma variedade de SDKs para muitas plataformas diferentes, incluindo iOS, Android e exemplos de plataformas cruzadas dedicadas e suporte para Xamarin. Por causa disso, meu aplicativo Active Fitness foi capaz de fazer o dimensionamento para dois milhões de usuários. Graças ao Azure e à sua confiabilidade, suporte e desempenho, os usuários são capazes de correr, caminhar e praticar várias atividades desportivas todos os dias com milhares de dispositivos conectados o tempo inteiro. Você pode encontrar diversos guias dedicados ao Xamarin no site do Azure que podem ajudar você a descobrir os serviços de nuvem da Microsoft mais adequados para seus aplicativos (bit.ly/2a5kciF). Enquanto isso, gostaria de mencionar algumas áreas comuns nas quais a nuvem é muito útil para aplicativos móveis:

Autenticação: Se precisar autenticar ou identificar usuários, você provavelmente precisará usar os serviços de nuvem no seu aplicativo Xamarin. Visite bit.ly/29HlDD3 para saber como.

Adicionando notificações por push aos seus aplicativos: As notificações por push não apenas oferecem um mecanismo de comunicação para aplicativos, mas também ajudam a atualizar recursos específicos da plataforma, como os blocos, por exemplo. Saiba mais em bit.ly/29HlDD3.

Sincronização offline: os aplicativos móveis de uso diário não estão sempre online, mas os dados precisam ser sincronizados automaticamente, mesmo quando os dispositivos ficam desconectados do back-end. Consulte meu artigo na Revista MSDN sobre conjuntos de dados que ficam desconectados em msdn.com/magazine/dn890372 e consulte também o guia de início rápido para aplicativos Xamarin em bit.ly/29QkXqT.

Os aplicativos móveis do Azure são um ótimo ponto de partida para integrar muitos serviços de nuvem incluindo armazenamento, notificações e autenticação. Verifique o tutorial em bit.ly/29K3IHi dedicado aos aplicativos Xamarin.

Extensões, Componentes e Plug-ins

O Xamarin obteve êxito e evoluiu através de uma compatibilidade considerável com componentes, plug-ins e extensões. Muitas extensões estão disponíveis no GitHub ou através do NuGet. Algumas bibliotecas como, por exemplo, as bibliotecas de cliente Android Support Libraries e Google Play Services, os SDKs do Facebook e as bibliotecas geradoras de gráficos de eventos, como a OxyPlot, são compatíveis com o Xamarin ou sua comunidade. Os plug-ins são ofertas exclusivas que permitem aos desenvolvedores acessar a funcionalidade nativa a partir do código compartilhado. Isso significa que se você deseja acessar a funcionalidade de GPS, já não precisa mais escrever o código três vezes, basta baixar um pacote NuGet e acessar o GPS diretamente no seu código compartilhado. Alguns plug-ins são de software livre e possuem suporte oferecido por desenvolvedores. Por exemplo, James Montemagno desenvolveu um grande número de plug-ins para Xamarin, como conectividade, configurações, mídia, entre outros (bit.ly/2a2mM7J).

A Figura 7 mostra várias extensões úteis que eu recomendo utilizar conforme você se aprofunda no desenvolvimento com Xamarin.

Figure 7 Extensões do Xamarin

Name Descrição Link do NuGet Documentos e Origem no GitHub
Status da Bateria Reúna o nível da bateria, o status de carregamento e o tipo. bit.ly/2a4gbZ6 bit.ly/2a5Ofqm
Scanner de Código de Barras Digitalize e crie códigos de barras com o ZXing.NET.Mobile. bit.ly/2a5Ofqm bit.ly/29QykY9
Bússola Acesse o cabeçalho da bússola do dispositivo. bit.ly/2a32UAZ bit.ly/29KfcKV
Conectividade Obtenha as informações de conectividade de rede como o tipo e se a conexão está disponível. bit.ly/29QDplO bit.ly/2a33PBr
Criptografia O PCL Crypto oferece um conjunto consistente e portátil de APIs de criptografia. bit.ly/29Qz5AE bit.ly/29PzwAb
Informações sobre o Dispositivo Obtenha as propriedades de um dispositivo, como o SO, modelo, versão e Id. bit.ly/29PzPeg bit.ly/29QzSBq
Movimento do Dispositivo Fornece acesso ao Acelerômetro, Giroscópio, Magnetômetro e Bússola. bit.ly/2a6SzTk bit.ly/2a35maG
Recurso Inserido Desempacote o recurso inserido para uso na plataforma cruzada. bit.ly/29J6Wf3 bit.ly/29J6z46
Mapas Externos Abra mapas externos a partir da latitude/longitude ou do endereço. bit.ly/29KgNR0 bit.ly/2abuJbI
Sistema de arquivos O PCL Storage fornece APIs de armazenamento para plataforma cruzada. bit.ly/29LEOru bit.ly/28Ju1AB
Geolocalizador Detecte a localização do GPS do dispositivo. bit.ly/2a70ekG bit.ly/29Tpuvd
Notificações Locais Exiba as notificações locais. bit.ly/2arOGYf bit.ly/29TpSd7
Mídia Tire ou escolha fotos e vídeos. bit.ly/2a6rpxi bit.ly/29TqlMm
Sistema de mensagens Faça chamadas, envie sms e email. bit.ly/2a8Uie5 bit.ly/29SEdDm
Permissões Verifique e solicite permissões do tempo de execução. bit.ly/29Tnvo8 bit.ly/29S6ZKv
Armazenamento da chave-valor Akavache Um armazenamento de chave-valor assíncrono e persistente (gravação em disco). bit.ly/29Tou7I bit.ly/2arPSLf
Notificações push Notificações por push de plataforma cruzada para iOS e Android. bit.ly/29ToDs5 bit.ly/2aex4CR
Configurações API de configurações simples e consistentes de plataforma cruzada. bit.ly/29ToTXT bit.ly/2a6tn0Q
Compartilhar Compartilhe facilmente texto e links ou abra um navegador. bit.ly/2aa2R51 bit.ly/2aa3sUk
Soquetes Ouvintes e clientes TCP e UDP, mais multicast UDP. bit.ly/1rQIyyR bit.ly/1y1UHPb
Texto de Fala Texto de fala a partir do código compartilhado. bit.ly/29S7Yud bit.ly/29MMA3S
Caixas de Diálogo do Usuário Ativa caixas de diálogo do tipo caixa de mensagens. bit.ly/2aa4dMV bit.ly/29Tqzkd
Monitoramento de Versões Monitora quais versões do seu aplicativo foram instaladas por um usuário. bit.ly/29S8YhH bit.ly/2a74lNW

Por exemplo, verificar a conectividade com o plug-in Conectividade em uma solução de plataforma cruzada torna-se um código de somente uma linha em vez de um código específico da plataforma que precisa ser implementado separadamente no iOS, Android e Windows:

public static bool IsOnline
  {
    get
    {
      return Plugin.Connectivity.CrossConnectivity.Current.IsConnected;
    }
  }

Você encontrará ainda mais plug-ins e extensões disponíveis em bit.ly/29XZ3VM.

Suporte a Dispositivos: Android Wear, WatchKit e Microsoft Band

O Xamarin sempre respondeu muito bem a todos os tipos de dispositivos e plataformas de dispositivo no mercado. Eu tive o prazer de trabalhar com a equipe do Microsoft Band e, no build de 2016, anunciamos em conjunto uma funcionalidade empolgante para o Active Fitness que adicionou suporte para mais de 50 atividades físicas, incluindo esqui, snowboarding e muito mais. Além disso, o Active Fitness agora é compatível com o Android Wear, conforme mostrado no belo mostrador do relógio na Figura 8. Se você instalar o Active Fitness no seu dispositivo Android, o mostrador do relógio é totalmente compatível.

Mostrador do Relógio Android Wear para o Aplicativo Active Fitness
Figura 8 Mostrador do Relógio Android Wear para o Aplicativo Active Fitness

Com o Xamarin, você pode adicionar dispositivos e suporte para gadgets e dispositivos usando o seguinte:

  • Android Wear: O Xamarin inclui exemplos de código e suporte, incluindo a criação de mostradores de relógio em C#.
  • Apple WatchKit: Para suporte ao Xamarin, verifique a documentação em bit.ly/29XZ3VM.
  • Microsoft Band: Além do SDK do Microsoft Band, há um wrapper fantástico do Microsoft Band para aplicativos do Xamarin de plataforma cruzada disponível no GitHub (bit.ly/29WeDli) e no NuGet (bit.ly/29SOoLA).

Desempenho e XAML Compilado

O Xamarin.Forms usa uma combinação de lógica de code-behing e XAML. Se você preferir, pode usar somente o código para instanciar e gerenciar seus objetos da interface do usuário. De fato, nada impede você codificar a maior parte da sua interface do usuário, além da eficiência (a natureza declarativa do XAML torna-o muito eficiente para gravação e gerenciamento). Mas, se você realmente quiser, pode obter sua página a partir do ContentPage e escrever toda a lógica no código, sem usar XAML, conforme mostrado na Figura 9.

Figura 9 Obtendo uma Página a partir do ContentPage sem Usar XAML

class ButtonCodePage : ContentPage
{
  int count = 0;
  public ButtonCodePage()
  {
    Button button = new Button
    {
      Text = String.Format("Tap for click count!")
    };
    button.Clicked += (sender, args) =>
    {
      count++;
      button.Text =
        String.Format("{0} click{1}!", count, count == 1 ? "" : "s");
    };
    this.Content = button;
  }
}

Neste caso, todo o código da interface do usuário está realmente compilado em C#. O XAML compilado utiliza uma ideia semelhante: Você pode dizer ao Xamarin para pré-compilar todo o seu XAML, o que faz com que o código da interface do usuário contido nos arquivos XAML fique muito mais rápido para carregar e executar. Existem diversos benefícios com o XAML compilado: verificação imediata do tempo de compilação, remoção do tempo de carregamento e criação de instâncias e redução do tamanho dos seus executáveis. Você pode ativar a compilação XAML no assembly:

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyApp

ou no nível da classe:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyPage

Conclusão

Após desenvolver com Xamarin, eu aprendi a me focar em produtividade e a aproveitar o poder da comunidade de software livre da Microsoft. Conforme já havia falado, o Xamarin tem respondido muito bem às tendências de dispositivos e software livre: Android Wear, Apple Watch, Microsoft Band e as versões mais recentes do Android, iOS e Windows. Veja algumas novidades notáveis do Xamarin que o tornam uma plataforma realmente empolgante:

  • Páginas de Dados: Simplificam a vinculação de dados e torna ainda mais fácil a criação de aplicativos com várias páginas (bit.ly/29SRtLk).
  • Kit de Ferramentas de Aplicativo Multilíngue e Localização: Compatibilidade total com projetos Xamarin, incluindo suporte para XLIFF padrão da indústria nos seus projetos (bit.ly/2a5Uzwx).
  • Incorporação de Controle Nativo: Torna a inclusão de controles nativos para aplicativos Xamarin muito mais fáceis (bit.ly/29IEvxH).
  • Efeitos: Adiciona efeitos específicos da plataforma nos aplicativos Xamarin (bit.ly/29RDrbD).

O Xamarin oferece uma forma poderosa e eficiente de criar aplicativos de plataforma cruzada de literalmente qualquer complexidade para iOS, Android e Windows. Você pode realmente se focar no conteúdo e funcionalidade do aplicativo e criar um aplicativo poderoso que funcionará em qualquer SO. E, após começar a criar seu primeiro aplicativo Xamarin, você logo descobrirá uma comunidade grande e animada de desenvolvedores de plataforma cruzada.


Kevin Ashley é um arquiteto evangelista da Microsoft. Ele é co-autor de "Professional Windows 8 Programming" (Wrox, 2012) e um desenvolvedor dos melhores aplicativos e jogos, sendo o Active Fitness o mais conhecido (activefitness.co). Ele apresenta frequentemente sobre tecnologia em vários eventos, apresentações da indústria e Webcasts. No seu cargo, ele trabalha com startups e parceiros, consultoria sobre design de software, estratégia de negócios e tecnologia, arquitetura e desenvolvimento. Siga-o no seu blog em kevinashley.com e no Twitter: @kashleytwit.

Agradecemos aos seguintes especialistas técnicos da Microsoft pela revisão deste artigo: James Montemagno