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
PRO

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

    View Slide

  2. @ubiratanfsoares
    +UbiratanSoares
    ubiratansoares
    ubiratansoares.github.io

    View Slide

  3. AGENDA
    Entendendo DeepLinking
    Entendendo AppIndexing
    Entendo AppLinks
    Links para crescer
    Conclusões e Referências

    View Slide

  4. DEEP LINKING

    View Slide

  5. View Slide

  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)

    View Slide

  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

    View Slide

  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

    View Slide

  9. DEMO
    github.com/ubiratansoares/deeplinking-appindexing-tutorial

    View Slide

  10. android:name=".ui.activities.ShotDetailsActivity"

    android:label=“@string/app_name">






    android:scheme="https"

    android:host="dribbble.com"

    android:pathPrefix="/shots"

    />




    // Etapas I e II : interceptando um link do Dribbble
    // AndroidManifest.xml

    View Slide

  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

    View Slide

  12. NÃO ROLA UMA
    SOLUÇÃO DA MODA ?

    View Slide

  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

    View Slide

  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?

    View Slide

  15. APP INDEXING

    View Slide

  16. View Slide

  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)

    View Slide

  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

    View Slide

  19. rel=“alternate”
    href=“android-app://com.package/http/my.app/content”
    />






    Existe uma referência adicional para esse conteúdo
    Essa referência é indexada por um protocolo específico

    View Slide

  20. DESTRINCHANDO O LINK
    android-app://com.app/http/my.app/content
    Android Indexing Protocol
    Application Package
    DeepLink URI Schema
    Link Host Path

    View Slide

  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

    View Slide

  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 result = AppIndex.AppIndexApi.start(gmsClient, action);

    result.setResultCallback(new URIIndexListener());

    }


    private void recordShotViewEnded() {

    Action action = AppIndexingUtils.getActionForShot(shot);

    PendingResult result = AppIndex.AppIndexApi.end(gmsClient, action);

    result.setResultCallback(new URIIndexListener());

    }


    View Slide

  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");

    }

    }

    View Slide

  24. View Slide

  25. Resultado indexado via app
    Resultado indexado via app

    View Slide

  26. APP LINKING

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide










  30. onde .well-know/statements.json será validado
    // AndroidManifest.xml

    View Slide

  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

    View Slide

  32. LINKS PARA CRESCER

    View Slide

  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)

    View Slide

  34. DEFERRED DEEP LINKING
    WEB PAGE
    (Content Page)
    Android Application
    (Content Screen)
    USER CHOOSE TO INSTALL
    USER OPENS APP

    View Slide

  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

    View Slide

  36. FINALIZANDO …

    View Slide

  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

    View Slide

  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

    View Slide

  39. OBRIGADO

    View Slide