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

D4b7a3e2ed10f86e0b52498713ba2601?s=128

Ubiratan Soares

October 17, 2015
Tweet

Transcript

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

    e o seu App Ubiratan Soares Outubro de 2015
  2. @ubiratanfsoares +UbiratanSoares ubiratansoares ubiratansoares.github.io

  3. AGENDA Entendendo DeepLinking Entendendo AppIndexing Entendo AppLinks Links para crescer

    Conclusões e Referências
  4. DEEP LINKING

  5. None
  6. 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)
  7. 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
  8. 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
  9. DEMO github.com/ubiratansoares/deeplinking-appindexing-tutorial

  10. <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
  11. 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
  12. NÃO ROLA UMA SOLUÇÃO DA MODA ?

  13. 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
  14. 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?
  15. APP INDEXING

  16. None
  17. 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)
  18. 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
  19. <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
  20. DESTRINCHANDO O LINK android-app://com.app/http/my.app/content Android Indexing Protocol Application Package DeepLink

    URI Schema Link Host Path
  21. 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
  22. // 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());
 }

  23. 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");
 }
 }
  24. None
  25. Resultado indexado via app Resultado indexado via app

  26. APP LINKING

  27. 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
  28. 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
  29. https://seuapp.com/.well-known/statements.json [{ "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app",
 "package_name": "com.seupacote.seuapp.etc",

    "sha256_cert_fingerprints": [“09:87:65:34:12:...”] }] } > keytool -list -v -keystore release.keystore
  30. <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
  31. 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
  32. LINKS PARA CRESCER

  33. 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)
  34. DEFERRED DEEP LINKING WEB PAGE (Content Page) Android Application (Content

    Screen) USER CHOOSE TO INSTALL USER OPENS APP
  35. 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
  36. FINALIZANDO …

  37. 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
  38. 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
  39. OBRIGADO