Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase dynamic link, clear it after using once

https://firebase.google.com/docs/dynamic-links/android/receive

states that

Calling getDynamicLink() retrieves the link and clears that data so it is only processed once by your app.

You normally call getDynamicLink() in the main activity as well as any activities launched by intent filters that match the link.

I copied the following code from the doc.

FirebaseDynamicLinks.getInstance()
        .getDynamicLink(getIntent())
        .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
            @Override
            public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                // Get deep link from result (may be null if no link is found)
                Uri deepLink = null;
                if (pendingDynamicLinkData != null) {
                    deepLink = pendingDynamicLinkData.getLink();
                }


                // Handle the deep link. For example, open the linked
                // content, or apply promotional credit to the user's
                // account.
                // ...

                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "getDynamicLink:onFailure", e);
            }
        });

If I put the above code on MainActivity:onCreate

  • when app is not running in background, deep link works fine
  • when app is running in background, deep link is not recognized (the onSuccess callback doesn't get called)

If I put the above code on MainActivity:onStart

  • when app is running in background or not, deep link works fine
  • If user clicks deep link, main activity gets it and opens approapriate activity, (works fine) but when he tries to go back to the main activity, onSuccess callback fires again and he never be able to go to the main activity.
like image 462
eugene Avatar asked Jan 06 '18 14:01

eugene


People also ask

Do Firebase dynamic links expire?

As far as I know, dynamic links work for as long as your firebase project active. I used some dynamic links more than one year after they were created.

How do I remove a dynamic link?

From the Firebase console, select the little three dots next to your link and then choose the "Archive Link" option from the pop-up menu. This will essentially delete it for all intents and purposes. (The deleted link will still work, but it'll no longer show up in the Firebase console.)

How do you debug a Firebase dynamic link?

To help you debug your Dynamic Links, you can preview your Dynamic Links' behavior on different platforms and configurations with an automatically-generated flowchart. Generate the flowchart by adding the d=1 parameter to any short or long Dynamic Link. For example, example. page.

What is difference between deep link and dynamic link?

Dynamic Links are deep links into an app that work whether or not users have installed the app yet. When users open a Dynamic Link into an app that is not installed, the app's Play Store page opens, where users can install the app. After users install and open the app, the app displays the deep-linked content.


1 Answers

Duplicate the code written in MainActivity:onCreate method (entire Firebase Dynamic Links related code) inside MainActivity:onNewIntent method, this works irrespective of the app is running in the background or not.

Also MainActivity:onNewIntent method is not invoked if the app is not present in background hence no duplicate Firebase call happens.

Your MainActivity should look like this

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...

    FirebaseDynamicLinks.getInstance()
            .getDynamicLink(getIntent())
            .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                @Override
                public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                    // Get deep link from result (may be null if no link is found)
                    Uri deepLink = null;
                    if (pendingDynamicLinkData != null) {
                        deepLink = pendingDynamicLinkData.getLink();
                    }


                    // Handle the deep link. For example, open the linked
                    // content, or apply promotional credit to the user's
                    // account.
                    // ...


            })
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "getDynamicLink:onFailure", e);
                }
            });
}

@Override
protected void onNewIntent(Intent intent) {
    //...

    FirebaseDynamicLinks.getInstance()
            .getDynamicLink(intent)
            .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                @Override
                public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                    // Get deep link from result (may be null if no link is found)
                    Uri deepLink = null;
                    if (pendingDynamicLinkData != null) {
                        deepLink = pendingDynamicLinkData.getLink();
                    }


                    // Handle the deep link. For example, open the linked
                    // content, or apply promotional credit to the user's
                    // account.
                    // ...


            })
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "getDynamicLink:onFailure", e);
                }
            });
}
like image 160
Naveen Kumar Avatar answered Nov 06 '22 22:11

Naveen Kumar