|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Dynamic Links" |
| 4 | +date: 2019-05-06 |
| 5 | +categories: ["Firebase"] |
| 6 | +image: firebase/dynamic_links |
| 7 | +github: firebase/tree/master/dynamic_links |
| 8 | +description: "Firebase" |
| 9 | +version: Firebase-Dynamic-Links 16.1 |
| 10 | +keywords: "firebase, link, łącze, internetowe, odnośnik, dynamiczne, dynamic, deep, web, udostępnianie, share, android, programowanie, programming" |
| 11 | +--- |
| 12 | + |
| 13 | +## Przeznaczenie |
| 14 | +`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 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`. |
| 15 | + |
| 16 | +## Tworzenie |
| 17 | +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. |
| 18 | + |
| 19 | +## Budowniczy |
| 20 | +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`. |
| 21 | + |
| 22 | +{% highlight kotlin %} |
| 23 | +private fun prepareDynamicLink() { |
| 24 | + val dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink() |
| 25 | + .setLink(Uri.parse("http://www.androidcode.pl/")) |
| 26 | + .setDomainUriPrefix("http://androidcode.page.link") |
| 27 | + //set parameters for target platforms like Android, iOS, GoogleAnalytics or provide social media metatags |
| 28 | + .setAndroidParameters(DynamicLink.AndroidParameters.Builder("pl.androidcode") |
| 29 | + .setMinimumVersion(2) //only for apps with version 2 code |
| 30 | + .build()) |
| 31 | + .setSocialMetaTagParameters(DynamicLink.SocialMetaTagParameters.Builder() |
| 32 | + .setTitle("Title") |
| 33 | + .setDescription("Description") |
| 34 | + .build()) |
| 35 | + .buildDynamicLink() |
| 36 | + |
| 37 | + val dynamicLinkUri = dynamicLink.uri |
| 38 | + |
| 39 | + //the link could be like below: |
| 40 | + //http://androidcode.page.link/?link=http://www.androidcode.pl&apn=pl.androidcode&amv=2&st=title&sd=description |
| 41 | +} |
| 42 | +{% endhighlight %} |
| 43 | + |
| 44 | +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`. |
| 45 | + |
| 46 | +{% highlight kotlin %} |
| 47 | +private fun prepareShortDynamicLink() { |
| 48 | + val shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink() |
| 49 | + .setLink(Uri.parse("http://www.androidcode.pl/")) |
| 50 | + .setDomainUriPrefix("http://androidcode.page.link") |
| 51 | + .setAndroidParameters(DynamicLink.AndroidParameters.Builder("pl.androidcode").build()) |
| 52 | + .buildShortDynamicLink(ShortDynamicLink.Suffix.SHORT) //pass this arg to get shorten sufix |
| 53 | + .addOnSuccessListener { result -> |
| 54 | + val shortLink = result.shortLink |
| 55 | + val previewLink = result.previewLink |
| 56 | + }.addOnFailureListener { |
| 57 | + //some action |
| 58 | + } |
| 59 | + |
| 60 | + //the link could be like below: |
| 61 | + //http://androidcode.page.link/abcd |
| 62 | +} |
| 63 | +{% endhighlight %} |
| 64 | + |
| 65 | +## Odbieranie |
| 66 | +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). |
| 67 | + |
| 68 | +{% highlight xml %} |
| 69 | +<!-- autoVerify flags is responsible for handling Dynamic Links using App Links --> |
| 70 | +<intent-filter android:autoVerify="true"> |
| 71 | + <action android:name="android.intent.action.VIEW"/> |
| 72 | + <category android:name="android.intent.category.DEFAULT"/> |
| 73 | + <category android:name="android.intent.category.BROWSABLE"/> |
| 74 | + <data android:host="androidcode.pl" android:scheme="http"/> |
| 75 | +</intent-filter> |
| 76 | +{% endhighlight %} |
| 77 | + |
| 78 | +{% highlight kotlin %} |
| 79 | +private fun receiveDynamicLink() { |
| 80 | + FirebaseDynamicLinks.getInstance() |
| 81 | + .getDynamicLink(intent) |
| 82 | + .addOnSuccessListener(this) { pendingDynamicLinkData -> |
| 83 | + // Get deep link from result (may be null if no link is found) |
| 84 | + var deepLink: Uri? = null |
| 85 | + if (pendingDynamicLinkData != null) { |
| 86 | + deepLink = pendingDynamicLinkData.link |
| 87 | + } |
| 88 | + }.addOnFailureListener { |
| 89 | + //some action |
| 90 | + } |
| 91 | +} |
| 92 | +{% endhighlight %} |
0 commit comments