【问题标题】:Firebase dynamic link, clear it after using onceFirebase动态链接,使用一次后清除
【发布时间】:2018-06-16 03:36:21
【问题描述】:

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

声明

调用 getDynamicLink() 检索链接并清除该数据,以便 它只被您的应用处理一次。

您通常在主要活动中调用 getDynamicLink() 以及任何 由匹配链接的意图过滤器启动的活动。

我从文档中复制了以下代码。

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

如果我把上面的代码放在MainActivity:onCreate

  • 当应用不在后台运行时,深层链接可以正常工作
  • 当应用在后台运行时,无法识别深层链接(不会调用onSuccess 回调)

如果我把上面的代码放在MainActivity:onStart

  • 无论应用是否在后台运行,深层链接都可以正常工作
  • 如果用户点击深层链接,主活动获取它并打开适当的活动,(工作正常)但是当他尝试返回主活动时,onSuccess 回调再次触发,他永远无法进入主活动活动。

【问题讨论】:

  • 对于onCreate() 的情况,您说onSuccess() 不会被调用。是否改为调用 onFailure()?在我使用getDynamicLink() 时,总是调用onSuccess(),第一个调用包含PendingDynamicLinkData,后续调用包含null。
  • @BobSnyder 没有 onSuccess 和 onFailure 都不会被调用。
  • 我也遇到了同样的问题。我认为 getDynamicLink() 会清除数据,但事实并非如此。并且该方法的每次调用每次都返回相同的链接。这样一次处理不了。
  • @eugene 我遇到了同样的问题,你解决了这个问题吗?第一步:在应用中收到动态链接。第 2 步:导航到所需的页面。第 3 步:应用程序进入后台。第四步:从后台打开应用,应用仍然导航到之前的动态链接页面。我正在使用 onStart() 方法
  • 我在这里回答了这个问题:stackoverflow.com/a/62985346/1432239

标签: android firebase firebase-dynamic-links


【解决方案1】:

MainActivity:onNewIntent 方法中复制用MainActivity:onCreate 方法编写的代码(整个Firebase 动态链接相关代码),无论应用程序是否在后台运行,这都有效。

如果应用程序不在后台,也不会调用 MainActivity:onNewIntent 方法,因此不会发生重复的 Firebase 调用。

您的 MainActivity 应如下所示

@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);
                }
            });
}

【讨论】:

    【解决方案2】:

    我通过获取一个全局 url 并将其下次与新 url 进行比较来保持一个肮脏的 hack,它并不完美,但它是我想出的最好的。

     var previousDeepLink:String?=null //take it as global and static
    
    
        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();
                }
    
                     if(previousDeepLink==deepLink?.toString()){
                            return@OnSuccessListener
                        }
                        previousDeepLink=deepLink?.toString()
    
    
    
                // 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);
            }
        });
    
                    
    

    【讨论】:

      【解决方案3】:

      答案在documents

      您必须在每个活动中调用 getDynamicLink() 由链接启动,即使该链接可能从 意图使用 getIntent().getData()。调用 getDynamicLink() 检索 链接并清除该数据,使其仅由您处理一次 应用程序。

      您通常在主要活动中调用 getDynamicLink() 以及任何 由匹配链接的意图过滤器启动的活动。

      【讨论】:

        猜你喜欢
        • 2019-04-24
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-26
        • 2019-04-10
        相关资源
        最近更新 更多