缩短 Firebase 动态 link
Shorten the Firebase dynamic link
以前,我使用以下动态 link 在我的应用程序中启动所需的页面
http://jstock.co/a/news?code=1295.KL&symbol=PUBLIC+BANK+BHD
但是,对于没有安装我的应用程序的用户来说,这有一个缺点。对于没有安装我的应用程序的用户,当他点击 link
时会发生这种情况
- 转到 Google Play 商店
- 安装应用程序。
- 启动应用程序。 将转到应用程序的第一页,而不是在 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 密钥 - 用于授权请求。我会做的是:
- 从 Firebase Console 重新下载 google-services.json 并覆盖您的项目
- 检查是否为 json 文件
/api_key/current_key
下的包名条目填写了 API 关键参数
- 检查您是否在应用程序底部包含了 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)。这显示了一些要在控制台中解决的警告。
以前,我使用以下动态 link 在我的应用程序中启动所需的页面
http://jstock.co/a/news?code=1295.KL&symbol=PUBLIC+BANK+BHD
但是,对于没有安装我的应用程序的用户来说,这有一个缺点。对于没有安装我的应用程序的用户,当他点击 link
时会发生这种情况- 转到 Google Play 商店
- 安装应用程序。
- 启动应用程序。 将转到应用程序的第一页,而不是在 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 密钥 - 用于授权请求。我会做的是:
- 从 Firebase Console 重新下载 google-services.json 并覆盖您的项目
- 检查是否为 json 文件
/api_key/current_key
下的包名条目填写了 API 关键参数 - 检查您是否在应用程序底部包含了 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)。这显示了一些要在控制台中解决的警告。