缩短 Firebase 动态 link

Shorten the Firebase dynamic link

以前,我使用以下动态 link 在我的应用程序中启动所需的页面

http://jstock.co/a/news?code=1295.KL&symbol=PUBLIC+BANK+BHD

但是,对于没有安装我的应用程序的用户来说,这有一个缺点。对于没有安装我的应用程序的用户,当他点击 link

时会发生这种情况
  1. 转到 Google Play 商店
  2. 安装应用程序。
  3. 启动应用程序。 将转到应用程序的第一页,而不是在 deep link 中指定的所需页面。

后来,我意识到 Firebase 动态 link 可以解决我的问题。如果我使用以下 URL,一切正常。

https://g7b6h.app.goo.gl/?link=http%3A%2F%2Fjstock.co%2Fa%2Fnews%3Fcode%3D1295.KL%26symbol%3DPUBLIC%2BBANK%2BBHD&apn=org.yccheok.jstock.gui

对于第 3 步,用户现在可以直接转到 deep link 中指定的所需页面,而不是转到应用程序的第一页。

不过,我觉得上面link太长了。看完https://firebase.google.com/docs/dynamic-links/android/create,我尝试用下面的方式缩短它

private void build() {
    Task<ShortDynamicLink> shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink()
            .setLongLink(Uri.parse("https://g7b6h.app.goo.gl/?link=http%3A%2F%2Fjstock.co%2Fa%2Fnews%3Fcode%3D1295.KL%26symbol%3DPUBLIC%2BBANK%2BBHD&apn=org.yccheok.jstock.gui"))
            .buildShortDynamicLink()
            .addOnCompleteListener(this, new OnCompleteListener<ShortDynamicLink>() {
                @Override
                public void onComplete(@NonNull Task<ShortDynamicLink> task) {
                    if (task.isSuccessful()) {
                        Log.i("CHEOK", "success");
                        // Short link created
                        Uri shortLink = task.getResult().getShortLink();
                        Uri flowchartLink = task.getResult().getPreviewLink();

                        Log.i("CHEOK", "shortLink = " + shortLink);
                        Log.i("CHEOK", "flowchartLink = " + flowchartLink);

                    } else {
                        Log.i("CHEOK", "error : " + task.getException().getMessage());
                        // Error
                        // ...
                    }
                }
            });
}

然而,每次,我都会得到error : Bad Request

知道我错过了哪一步吗?

谢谢。

我的猜测是您的 setLongLink 方法中的 URI 不需要采用 UTF-8 编码。 Firebase 的示例显示了这一点:

Task<ShortDynamicLink> shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink()
    .setLongLink(Uri.parse("https://abc123.app.goo.gl/?link=https://example.com/&apn=com.example.android&ibn=com.example.ios"))
    .buildShortDynamicLink()

希望这能解决您的问题,但我从来不知道 Firebase。

为了以更简单的方式处理此问题,我的建议是将深层链接切换为 Branch(我在那里工作,但之前使用 Firebase 进行了全面披露)。它会自动生成短链接,因为这些链接实际上存储了 JSON 类型的对象,而不是在参数中。只是一个想法:)

错误请求很可能表示无效的 API 密钥 - 用于授权请求。我会做的是:

  1. Firebase Console 重新下载 google-services.json 并覆盖您的项目
  2. 检查是否为 json 文件 /api_key/current_key 下的包名条目填写了 API 关键参数
  3. 检查您是否在应用程序底部包含了 google-services 插件并调用了 apply build.gradle

您可以对照文档中的步骤进行检查:https://firebase.google.com/docs/android/setup#manually_add_firebase

这应该有望修复 API 访问。

当你这样做的时候,你可能想检查你的 link 的调试版本:https://g7b6h.app.goo.gl/?link=http%3A%2F%2Fjstock.co%2Fa%2Fnews%3Fcode%3D1295.KL%26symbol%3DPUBLIC%2BBANK%2BBHD&apn=org.yccheok.jstock.gui&d=1(最后是 &d=1)。这显示了一些要在控制台中解决的警告。