Firebase 动态链接是否支持自定义参数?

Firebase dynamic link support custom parameters?

我正在为开源会议编写一个应用程序。

最初每个与会者将通过电子邮件或短信收到不同的链接,例如

https://example.com/?token=fccfc8bfa07643a1ca8015cbe74f5f17

然后用这个链接打开app,我们可以通过token知道用户是哪个参加者。

Firebase 在 I/O 2016 中发布了一个新功能 Dynamic Links,它为用户提供了更好的体验。

我试过了,但是我找不到任何方法在动态链接中传递自定义参数(令牌),如何将具有不同参数的相同链接使用给我的用户?

谢谢。


我认为您不能使用短网址:
https://<my app>.app.goo.gl/Gk3m
除非您为每个用户创建一个,但您可以使用长 url:
https://<my app>.app.goo.gl/?link=https://example.com/?token=fccfc8bfa07643a1ca8015cbe74f5f17 ...(add other parameters as needed)
并为每个用户设置新令牌。

我假设您会自动生成令牌。在这种情况下,您可以使用它来缩短链接。


1) 来自 https://console.firebase.google.com/ (这里不需要自定义参数。)

enter image description here

2) 在某处创建链接,例如在您的汇合页面上(这里我们添加我们的参数):

1
https://PROJECTNAME.page.link/?link=https://PROJECTNAME.page.link/LINKNAME?PARAMETER=1&ofl=https://www.PROJECTNAME.com/

PARAMETER 是您的自定义参数。

ofl 是从另一个平台(PC、Mac)单击链接时转到的链接。

3) 从android项目Kotlin代码中获取链接数据:

1
2
3
4
5
6
Firebase.dynamicLinks
        .getDynamicLink(intent)
        .addOnSuccessListener { pendingDynamicLinkData ->
            val parameter: String =
                pendingDynamicLinkData?.link?.getQueryParameter("PARAMETER").orEmpty()
        }

如果您想在 REST 中使用带有自定义参数的动态链接,下面是一个有效负载示例:

1
2
3
4
5
6
7
8
9
{
 "dynamicLinkInfo": {
       "dynamicLinkDomain":"example.app.goo.gl",
       "link":"http://someurl.com?my_first_param=test&my_second_param=test2"
  },
 "suffix": {
    "option":"UNGUESSABLE"
    }
}

确保从您的 dynamicLinkDomain 中删除"https://"

朱利安


案例A.如果你想把短链接展开成有多个参数的链接:

在您设置动态链接的部分,您附加到深层链接 URL 的任何参数都将适用于所有平台(web、iOS、android)
enter image description here

案例B.如果要使用动态参数,应该使用api创建短链接

见文档


现在您可以通过 FirebaseDynamicLinks.getInstance().createDynamicLink() 使用 Firebase SDK 创建短链接:
https://firebase.google.com/docs/dynamic-links/android/create

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Task shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink()
    .setLink(Uri.parse("https://example.com/"))
    .setDynamicLinkDomain("abc123.app.goo.gl")
    // Set parameters
    // ...
    .buildShortDynamicLink()
    .addOnCompleteListener(this, new OnCompleteListener() {
        @Override
        public void onComplete(@NonNull Task task) {
            if (task.isSuccessful()) {
                // Short link created
                Uri shortLink = task.getResult().getShortLink();
                Uri flowchartLink = task.getResult().getPreviewLink();
            } else {
                // Error
            }
        }
    });

1 首先将 Firebase 控制台中的动态链接从 http://exampleandroid/test 更改为 http://exampleandroid/test?data 2. 您使用此发送查询参数数据

1
2
3
4
5
6
7
8
9
10
11
 DynamicLink dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink()
                   // .setLink(dynamicLinkUri)
                    .setLink(Uri.parse("http://exampleandroid/test?data=dsads"))
                    .setDomainUriPrefix("https://App_Name.page.link")
                    // Open links with this app on Android
                    .setAndroidParameters(new DynamicLink.AndroidParameters.Builder().build())
                    // Open links with com.example.ios on iOS
                    .setIosParameters(new DynamicLink.IosParameters.Builder("com.appinventiv.ios").build())
                    .buildDynamicLink();

            dynamicLinkUri = dynamicLink.getUri();

您可以在链接中添加额外参数以从 Firebase 生成短网址。
在这里,我给出了使用 Firebase API 生成短 URL 的示例。
这里 ServiceRequestHelper(this).PostCall 是我发出 API 请求的通用类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
String url ="https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=YOUR_KEY";

    try {
        PackageManager manager = this.getPackageManager();
        PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
        JSONObject jsonObject = new JSONObject();
        JSONObject androidInfoObject = new JSONObject();
        androidInfoObject.put("androidPackageName", getApplicationContext().getPackageName());
        androidInfoObject.put("androidMinPackageVersionCode",String.valueOf(info.versionCode));

        JSONObject iosInfoObject = new JSONObject();
        iosInfoObject.put("iosBundleId","tettares.Test_ID");
        JSONObject dynamicLinkInfoObj = new JSONObject();
        dynamicLinkInfoObj.put("dynamicLinkDomain","wgv3v.app.goo.gl");
        dynamicLinkInfoObj.put("link","https://test.in/?UserId=14&UserName=Naveen");  // Pass your extra paramters to here
        dynamicLinkInfoObj.put("androidInfo", androidInfoObject);
        dynamicLinkInfoObj.put("iosInfo", iosInfoObject);

        JSONObject suffixObject = new JSONObject();
        suffixObject.put("option" ,"SHORT");
        jsonObject.put("dynamicLinkInfo", dynamicLinkInfoObj);
        jsonObject.put("suffix", suffixObject);

        Log.d("JSON Object :" , jsonObject.toString());

        new ServiceRequestHelper(this).PostCall(url, jsonObject, false, new CallBackJson() {
            @Override
            public void done(JSONObject result) throws JSONException {

                try {
                    if (result.has("shortLink")) {
                        DEEP_LINK_URL = result.getString("shortLink");                                                   }
                } catch(Exception e)
                {
                    e.printStackTrace();
                }

            }
        });


    } catch (JSONException | PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

在您的接收活动中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
boolean autoLaunchDeepLink = false;
    AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink)
            .setResultCallback(
                    new ResultCallback<AppInviteInvitationResult>() {
                        @Override
                        public void onResult(@NonNull AppInviteInvitationResult result) {
                            if (result.getStatus().isSuccess()) {
                                // Extract deep link from Intent
                                Intent intent = result.getInvitationIntent();
                                String deepLink = AppInviteReferral.getDeepLink(intent);

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

                                // [START_EXCLUDE]
                                // Display deep link in the UI
                                Log.d(TAG,"deeplink URL:" + deeplink); // Here you get https://test.in/?UserId=14&UserName=Naveen
                                // [END_EXCLUDE]
                            } else {
                                Log.d(TAG,"getInvitation: no deep link found.");
                            }
                        }
                    });

用于生成动态链接的网络应用程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const data = {
  dynamicLinkInfo: {
    domainUriPrefix: 'subdomain.page.link',
    link: url,
  },
  suffix: {
    option: 'SHORT'
  }
};
return fetch(`https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=${environment.firebaseConfig.apiKey}`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data),
}).then(res => res.json()).then(response => response.shortLink).catch(console.error);

我尝试了以上所有方法,但没有任何效果。所以我认为你应该将链接 http://example.com/?userid=123 更改为 http://example.com/userid/123


不需要所有的喧嚣

  • 如果要传递参数,请不要缩短 url
  • 这样写链接。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //APP_CODE is firebase link
    String link ="https://APP_CODE.app.goo.gl/?refferer=" + userId;

    Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
                    .setMessage(getString(R.string.invitation_custom_message)))
                    .setDeepLink(Uri.parse(link))
                    .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image)))
                    .setCallToActionText(getString(R.string.invitation_cta))
                    .build();

    startActivityForResult(intent, REQUEST_INVITE);