Dynamic Links

Firebase

  |   6 min czytania
(Firebase-Dynamic-Links 16.1)

Przeznaczenie

Dynamic Links jest sposobem na generowanie i przetwarzanie dynamicznych łączy internetowych działających w dowolnie zaprojektowany sposób niezależnie od platformy. W przypadku uruchomienia łącza na urządzeniu z systemem Android i zainstalowaną aplikacją obsługującą ustalony format Dynamic Links otwierany jest oczekiwany ekran z podaną zawartością. Gdy urządzenie nie posiada wskazanej aplikacji lub usług Play Services wówczas użytkownik może zostać przekierowany do właściwej strony Play Store w celu zainstalowania brakującej aplikacji. Jeśli łącze zostanie otworzone w przeglądarce urządzenia bądź komputera nastąpi wyświetlenie strony internetowej. Dynamic Links mogą zostać wykorzystane m.in. w zadaniu konwersji użytkowników z internetowej do mobilnej wersji aplikacji, przeprowadzaniu kampanii marketingowej, wysyłaniu zaproszeń do korzystania z aplikacji czy też dzieleniu treści z innym użytkownikami. Tworzenie łączy może odbywać się z poziomu konsoli Firebase, ręczne formowanie URL z parametrami, programowo z kodzie aplikacji przy użyciu Android API czy REST API.

Tworzenie

Generowania łącza z poziomu konsoli Firebase pozwala na wybranie niestandardowego linku oraz śledzenia skuteczności co z uwagi na łatwą konfiguracje jest przydatne przede wszystkim w sytuacji tworzenia odnośnika promocyjnego do udostępnienia w mediach społecznościowych. Korzystanie z Dynamic Link Builder API po stronie kodu aplikacji jest preferowanym sposobem w większości sytuacji, a przede wszystkim w zadaniach udostępniania i przesyłania treści między użytkownikami oraz tam gdzie potrzebne jest wiele linków. Jeśli projekt nie wymaga śledzenia i analizy danych, łącza mogą zostać stworzone także ręcznie przy wykorzystaniu parametrów w adresie URL co pozwala na minimalizacje ruchu sieciowego.

Budowniczy

Aby utworzyć obiekt dynamicznego łącza DynamicLink przy użyciu API budowniczego należy wywołać metodę createDynamicLink, dokonać konfiguracji dla wybranych platform i następnie wywołać buildDynamicLink.

private fun prepareDynamicLink() {
    val uri = createUri("PARAM", "value1") //create uri with params
    val dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink()
        .setLink(uri)
        .setDomainUriPrefix("https://androidcode.page.link")
        //set parameters for target platforms like Android, iOS, GoogleAnalytics or provide social media metatags
        .setAndroidParameters(DynamicLink.AndroidParameters.Builder("pl.androidcode")
            .setMinimumVersion(2) //only for apps with version 2 code
            .build())
        .setSocialMetaTagParameters(DynamicLink.SocialMetaTagParameters.Builder()
            .setTitle("Title")
            .setDescription("Description")
            .build())
        .buildDynamicLink()

    val dynamicLinkUri = dynamicLink.uri

    //the link could be like below:
    //http://androidcode.page.link/?link=http://www.androidcode.pl&apn=pl.androidcode&amv=2&st=title&sd=description
}

private fun createUri(key: String, param: String): Uri {
    val builder = Uri.Builder()
    builder.scheme("http").authority("androidcode.pl")
        .appendQueryParameter(key, param)
    return builder.build()
}

Skrócona wersja odnośnika składa się domyślnie 17 znakowego unikalnego sufiksu co wymaga zapytania sieciowego oraz obiektu słuchacza i tworzona jest przy użyciu metody buildShortDynamicLink.

private fun prepareShortDynamicLink() {
    val uri = createUri("PARAM", "value2") //create uri with params
    val shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink()
        .setLink(uri)
        .setDomainUriPrefix("https://androidcode.page.link")
        .setAndroidParameters(DynamicLink.AndroidParameters.Builder("pl.androidcode").build())
        .buildShortDynamicLink(ShortDynamicLink.Suffix.SHORT) //pass this arg to get shorten sufix
        .addOnSuccessListener { result ->
            val shortLink = result.shortLink
            val previewLink = result.previewLink
        }.addOnFailureListener {
            //some action
        }

    //the link could be like below:
    //http://androidcode.page.link/abcd
}

Odbieranie

Aby odebrać i przetworzyć otrzymany DynamicLink należy dodać w AndroidManifest poniższy wpis konfiguracyjny intent-filter do aktywności odpowiedzialnej za przechwytywanie linków (Deep Link i App Link), wywołać metodę getDynamicLink oraz wykonać akcję na podstawie odebranych danych. Należy mieć na uwadzę, że wykonanie metody getDynamicLink czyści przekazane dane więc jej użycie jest jednorazowe. Ponadto dodanie w AndroidManifest obsługi Android App Links umożliwia pominięcie dialogu wyboru aplikacji która ma obsłużyć odnośnik i bezpośrednie skierowanie do wyznaczonej aplikacji (co w przypadku Deep Links może nie być możliwe).

<!-- autoVerify flags is responsible for handling Dynamic Links using App Links -->
<!-- add filter to MainActivity -->
<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:host="androidcode.page.link" android:scheme="http"/>
    <data android:host="androidcode.page.link" android:scheme="https"/>
</intent-filter>
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        receiveDynamicLink() 
    }

    private fun receiveDynamicLink() {
        FirebaseDynamicLinks.getInstance()
            .getDynamicLink(intent)
            .addOnSuccessListener(this) { pendingDynamicLinkData ->
                // Get deep link from result (may be null if no link is found)
                var deepLink: Uri? = null
                if (pendingDynamicLinkData != null) {
                    deepLink = pendingDynamicLinkData.link
                    //check query parametrs exist and values
                    val param = deepLink.getQueryParameter("PARAM")
                    //do something based on params
                }
            }.addOnFailureListener {
                //some action
            }
    }
}

Indeksowanie aplikacji

App Indexing jest usługą indeksowania aplikacji do wyników wyszukiwarki Google, gdzie wybrane strony witryny internetowej zostają powiązane z treściami zawartymi w aplikacji mobilnej. Dzięki temu zapytania użytkowników mogą być przetworzone w taki sposób, aby bezpośrednio kierować użytkownika do wybranego ekranu w aplikacji, Sklepu Play lub standardowo do witryny internetowej. Indeksowanie aplikacji ułatwia przyciąganie potencjalnych nowych użytkowników, którzy mogą dowiedzieć się o istnieniu aplikacji z wyników wyszukiwarki, a bieżącym użytkownikom pozwala na zwiększenie jakości odbioru korzystania z aplikacji (User Experience). Aby indeksować zawartośc aplikacji przez Google należy po stronie witryny dokonać konfiguracji adresów URL obsługiwanych przez mechanizm Dynamic Links w aplikacji.