【问题标题】:Firebase PendingDynamicLinkData in Android is nullAndroid 中的 Firebase PendingDynamicLinkData 为空
【发布时间】:2022-01-03 11:45:12
【问题描述】:

以下是我所做的完整步骤:

  1. 已将 firebase.json 更新为以下内容:

    "appAssociation": "AUTO", "rewrites": [ { "source": "/product/**", "dynamicLinks": true } ]

  2. 我的网站域 example.com 托管在 Firebase 中。因此,使用 firebase deploy --only hosting

    上传 firebase.json
  3. Firebase 动态链接

    中添加了以下动态网址前缀

    https://example.com/product

Screenshot of Firebase Dynamic Link

  1. build.gradle(:app) 文件中实现了bom、动态链接和分析李>
implementation platform('com.google.firebase:firebase-bom:29.0.3')

implementation 'com.google.firebase:firebase-dynamic-links'

implementation 'com.google.firebase:firebase-analytics'
  1. 使用以下代码创建了一个动态链接:
private void handleFirebaseDynamicLink() {
        DynamicLink dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink()
                .setLink(Uri.parse("https://example.com/product/?productSKU=" + ProductSKU))
                .setDomainUriPrefix("https://example.com/product/")
                .setAndroidParameters(
                        new DynamicLink.AndroidParameters.Builder("com.myapp.myapp").build())
                .buildDynamicLink();


        try {
            String url = URLDecoder.decode(dynamicLink.getUri().toString(), "UTF-8");
            Log.d(TAG, "handleFirebaseDynamicLink: " + url);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
  1. 上述方法生成的动态链接为:
https://example.com/product/?apn=com.myapp.myapp&link=https://example.com/product/?productSKU=SKU-0004
  1. 为了接收动态链接,我在 AndroidManifest.xml 文件中为我的活动创建了以下意图过滤器:
<activity
            android:name=".Product_Details">

            <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="example.com"
                    android:pathPrefix="/product"
                    android:scheme="https" />
            </intent-filter>

</activity>
  1. onCreate() 中的一个方法,通过调用 -
//Fetching productSKU
fetchProductSKU(getIntent());

接收动态链接如下:

private void fetchProductSKU(Intent intent) {
        if (intent.getAction() != null) {
            if (intent.getAction().equals(Intent.ACTION_VIEW)) {
                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();
                                    Log.d(TAG, "handleFirebaseDynamicLink: " + deepLink);
                                } else {
                                    Log.d(TAG, "handleFirebaseDynamicLink: pendingDynamicLinkData null");
                                }


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

            }
        }
    }
  1. 在我的物理移动设备上使用 ADB Shell 命令我使用以下命令测试动态链接 -
adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "https://example.com/product/?apn=com.myapp.myapp&link=https://example.com/product/?productSKU=SKU-0004"
  1. 这又会启动预期的活动。但是,pendingDynamicLinkData 返回 null。
2022-01-03 17:29:15.141 12914-12914/com.myapp.myapp D/Product_Details: handleFirebaseDynamicLink: pendingDynamicLinkData null
  1. 我试过了-

一个。使用不同的动态链接前缀,例如 - /product(末尾没有“/”,例如 /product/ ),在 .setLink 末尾没有查询参数 /?productSKU=" + ProductSKU >.setDomainUriPrefix 同时建立动态链接,

b.通过仅使用 dynamicLink.getUri().toString() 而不是 URLDecoder.decode(dynamicLink.getUri().toString 转换创建的动态链接(), "UTF-8") 方法。

  1. 上述方法均无效。任何帮助将不胜感激。

【问题讨论】:

    标签: java android firebase null firebase-dynamic-links


    【解决方案1】:

    经过更多研究和少量调试后,在通过 ADB 进行测试期间,Android 中的意图似乎删除了 URL 中的多个参数。但是,只保留了第一个参数。

    因此,在我的情况下,仅保存了 apn 参数,而有意删除了 link 参数。因此,pendingDynamicLinkData 返回 null。

    如果通过电子邮件发送,生成的动态链接可以正常工作。

    在android中通过intent删除多个参数由以下线程解释:

    Android Deep Linking with multiple query parameters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 2022-01-19
      • 2018-05-23
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多