Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deeplinking, Appindexing e Além

Deeplinking, Appindexing e Além

Slides da minha sobre Deeplinking e AppIndexing, utilizados durante a edição 2015 do DevFest Nordeste

Ubiratan Soares

October 17, 2015
Tweet

More Decks by Ubiratan Soares

Other Decks in Programming

Transcript

  1. DEEPLINKING, APP INDEXING E ALÉM Conteúdo espelhado entre a Web

    e o seu App Ubiratan Soares Outubro de 2015
  2. DEEP LINKING Mecanismo para fazer sua aplicação Android responder a

    links Aspecto prático : conteúdo da aplicação Web está espelhado dentro da aplicação mobile e pode ser endereçado da mesma Objetivo principal : re-engajamento do usuário Outras possibilidades em função de links que apenas só a sua aplicação responda (exemplo : verificação de usuário)
  3. O QUE É UM LINK ? Android oferece suporte "a

    dois" formatos de links : URIs e URLs Toda URL é uma URI Nem toda URI é uma URL (RFC 3986) Exemplo de URL válida : https://user.content.com/images Exemplo de URI válida : content://user/images
  4. DEEP LINKING 101 1 Decida qual é a URL/URI que

    determinada tela da sua aplicação (Activity) deve responder 2 Adicione um IntentFilter para cada variante desse link como atributo de resolução implícita no AndroidManifest 4 Aplique lógica adequada partir desses dados 3 Intercepte os dados de interesse a partir do Intent de entrada
  5. <activity
 android:name=".ui.activities.ShotDetailsActivity"
 android:label=“@string/app_name"> 
 <intent-filter>
 <action android:name="android.intent.action.VIEW" />
 <category android:name="android.intent.category.DEFAULT"

    />
 <category android:name="android.intent.category.BROWSABLE" />
 
 <data
 android:scheme="https"
 android:host="dribbble.com"
 android:pathPrefix="/shots"
 />
 
 </intent-filter>
 </activity>
 // Etapas I e II : interceptando um link do Dribbble // AndroidManifest.xml
  6. private void verifyDeepLinking() {
 final Uri inputURI = getIntent().getData();
 if

    (inputURI != null) { 
 final String url = inputURI.toString();
 String shotId = parseShotId(url);
 
 if (shotId != null) retriveShotWithId(shotId);
 }
 }
 
 private String parseShotId(String urlAsString) { // https://dribble.com/shots/{id}-title-with-dashes
 String[] parts = urlAsString.replace("https://", "").split("/");
 String path = parts[2];
 String id = path.split("-")[0];
 return id;
 } // Etapa III : Obtendo dados de interesse do Intent
  7. THERE IS A LIBRARY FOR THAT ! Orientada por processamento

    de anotações Adota estratégia de Activity de roteamento (DeepLinkActivity) Suporte a múltiplos URI esquemas e múltiplos links por tela, padrão de launchIntents e mais https://github.com/airbnb/DeepLinkDispatch
  8. Deeplinks representam pontos de entrada na UI adicionais para a

    aplicação Sua aplicação (re) faz inicializações cross-app de forma desacoplada da UI? Como fica o backstack após o deeplinking? Você é sempre capaz de rotear para uma tela e oferecer bom suporte a Up Navigation? Suas URLs são bem desenhadas e passíveis de parsing? Todo o conteúdo da tela é acessível via dados da URL + WS ? E se não for, como fazer?
  9. INDEXANDO SEU APP Mecanismo para associar o conteúdo da aplicação

    ao buscador do Google Principais benefícios : Resultados indexados localmente disponíveis via auto-completar na busca do Google Re-engajamento de usuários via integração com resultados de busca do Google, incluindo integrações adicionais (eg AppInstalls)
  10. ASSOCIANDO CONTEÚDOS Ponto de conexão : Deep Links Aplicação Web

    deve indicar ao Google Crawler quais links são endereçáveis na aplicação móvel Aplicação móvel deve responder aos links determinados como indexáveis, associando o ciclo de vida da tela com o ciclo de visualização do conteúdo
  11. <link rel=“alternate” href=“android-app://com.package/http/my.app/content” /> <html> <head> </head> </html> <...> <...>

    Existe uma referência adicional para esse conteúdo Essa referência é indexada por um protocolo específico
  12. APP INDEXING 101 1 Certifique-se de que cada URL indexada

    na web e que está associada à aplicação tem o deeplink implementado 2 Obtenha uma instância do cliente GMS (GoogleAPIClient) 3 Usando a API de AppIndexing, vincule o ciclo de visualização de um conteúdo no aplicativo ao link correspondente para cada deeplink
  13. // Obtendo uma instância de GMSClient e indexando conteúdo @Override

    protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 gmsClient = new GoogleApiClient.Builder(this)
 .addApi(AppIndex.APP_INDEX_API)
 .build();
 
 onNewIntent(getIntent());
 }
 private void recordShotViewed() {
 Action action = AppIndexingUtils.getActionForShot(shot);
 PendingResult<Status> result = AppIndex.AppIndexApi.start(gmsClient, action);
 result.setResultCallback(new URIIndexListener());
 }
 
 private void recordShotViewEnded() {
 Action action = AppIndexingUtils.getActionForShot(shot);
 PendingResult<Status> result = AppIndex.AppIndexApi.end(gmsClient, action);
 result.setResultCallback(new URIIndexListener());
 }

  14. private static final String PACKAGE = "br.ufs.android.linking.demo";
 private static final

    String SCHEMA = "https";
 private static final String HOST = "dribbble.com";
 
 private static final Uri BASE_INDEX_URI = Uri.parse(
 "android-app:" + "//" + PACKAGE + "/" + SCHEMA + "/" + HOST
 );
 
 public static Action getActionForShot(DribbbleShot shot) {
 final String title = shot.getTitle();
 
 try {
 URL url = new URL(shot.getWebURL());
 String path = url.getPath().substring(1); // MIAU
 Uri uri = BASE_INDEX_URI.buildUpon().appendEncodedPath(path).build();
 
 return Action.newAction(Action.TYPE_VIEW, title, uri);
 
 } catch (MalformedURLException e) {
 throw new IllegalArgumentException("Malformed URL for Shot");
 }
 }
  15. APP LINKS Mecanismo para facilitar integração com deeplinks, disponível a

    partir do Android Marshmallow Menor fricção entre links da Web e experiência nativa com a remoção do ChooserDialog Deeplinks ainda precisam ser tratados manualmente dentro da aplicação Representa uma tendência para adotar o esquema HTTP como padrão na mecânica de deeplinking
  16. LOGÍSTICA DO APP-LINKING PACKAGE MANAGER INTENT VERIFIER WEB SERVER HTTP

    CACHE INTENT_FILTER_NEEDS_VERIFICATION pkg:com.myapp.etc.android VERIFIED HTTP GET statements.json HTTP 200 OK DEVICE
  17. <activity…> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category

    android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="seuapp.com" /> <data android:scheme="http" android:host="www.seuapp.com" /> </intent-filter> </activity> onde .well-know/statements.json será validado // AndroidManifest.xml
  18. MAIS DETALHES Verificação falha com timeout de 5s contra o

    web server ou por falha de conectividade Resultado respeita mecanismo de HTTP Caching (max-age, etags, etc), apenas para status 200 JSON de validação deve ser acessível de ambos os hostnames Novas verificações a princípio serão realizadas apenas mediante updates ou re-instalações da aplicação
  19. USER ATTRIBUITION Mecanismo para identificar o usuário após a uma

    instalação bem sucedida da aplicação Fundamental para entender em quais canais vale a pena investir por crescimento não-orgânico Normalmente melhor implementado por ferramentas dedicadas, que oferecem garantia de procedêndia dos dados de atribuição Em geral integrado em ferramentas de Analytics (redundância)
  20. DEFERRED DEEP LINKING Extensão da atribuição de usuário Em geral

    implementado por ferramentas dedicadas em conjunto com mecanismo de deeplink customizado Ótima experiência inicial para usuário não-orgânico
  21. CONCLUSÕES Deeplinks são a ponte entre aplicações web e mobile

    Usuário quer o mesmo conteúdo, independente de plataforma Integrações com links diminuem a fricção e melhoram a experiência do usuário como um todo Deeplinking e AppIndexing ajudam no re-engajamento de usuários
  22. REFERÊNCIAS • Documentação para DeepLinking - http://bit.ly/1LUHzrd • Documentação para

    AppIndexing - http://bit.ly/1Lg6uSJ • Documentação para AppLinks- http://bit.ly/1NOPPJN • CodeLab Oficial para App Indexing - http://bit.ly/1RgPey1 • DeepLinkDispatch - https://github.com/airbnb/DeepLinkDispatch • Github Demo - http://bit.ly/1MJZ4tk