Firebase Dynamic Links无法获取invitedby参数问题求助
解决Firebase动态链接在APP内无法获取invitedby参数的问题
我之前开发邀请奖励功能时,完完全全碰到过和你一样的坑!浏览器里打开短链能看到完整的invitedby参数,但APP里用getDynamicLink拿到的却是短链本身,根本取不到参数,当时折腾了好一阵子才搞定。
先说说可能的原因和对应的解决方法:
1. 生成链接时参数没正确编码
如果你的手机号包含+或者其他特殊字符,直接拼接进链接会导致Firebase解析时出错。虽然浏览器能自动处理,但APP内的Firebase SDK可能无法正确解析出参数。
修改生成链接的代码,对手机号进行URL编码:
String encodedPhone = Uri.encode(user.getPhone()); String link = "https://samplelink.com/?invitedby=" + encodedPhone;
2. AndroidManifest的Intent-Filter配置有误
Firebase动态链接需要你的APP能正确接收对应的链接请求,如果Manifest里的配置不对,SDK就无法自动解析短链到原始长链。
检查你的Activity(处理链接的那个)里的Intent-Filter,确保包含以下配置:
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <!-- 匹配你的短链域名 --> <data android:scheme="https" android:host="q7rxq.app.goo.gl"/> <!-- 同时匹配原始链接的域名,确保万无一失 --> <data android:scheme="https" android:host="samplelink.com"/> </intent-filter>
3. getDynamicLink的调用时机不对
如果你的APP已经在后台运行,点击动态链接会触发onNewIntent而不是onCreate,如果只在onCreate里调用getDynamicLink,就会错过解析链接的时机。
把解析代码移到一个公共方法里,在onCreate和onNewIntent里都调用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handleDynamicLink(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleDynamicLink(intent); } private void handleDynamicLink(Intent intent) { FirebaseDynamicLinks.getInstance() .getDynamicLink(intent) .addOnSuccessListener(this, pendingDynamicLinkData -> { Uri deepLink = null; if (pendingDynamicLinkData != null) { deepLink = pendingDynamicLinkData.getLink(); } FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if (user == null && deepLink != null) { String referrerUid = deepLink.getQueryParameter("invitedby"); // 这里先打印确认一下referrerUid是否存在 Log.e(TAG, "Referrer UID: " + referrerUid); if (referrerUid != null) { createAnonymousAccountWithReferrerInfo(referrerUid); } } }); }
4. 手动兜底解析短链
如果以上方法都不行,那就手动对短链进行二次解析,强制获取原始链接:
private void handleDynamicLink(Intent intent) { FirebaseDynamicLinks.getInstance() .getDynamicLink(intent) .addOnSuccessListener(this, pendingDynamicLinkData -> { Uri deepLink = null; if (pendingDynamicLinkData != null) { deepLink = pendingDynamicLinkData.getLink(); } if (deepLink != null && deepLink.getHost().equals("q7rxq.app.goo.gl")) { // 说明拿到的是短链,手动解析一次 FirebaseDynamicLinks.getInstance().getDynamicLink(deepLink) .addOnSuccessListener(pendingData -> { if (pendingData != null) { Uri originalLink = pendingData.getLink(); String referrerUid = originalLink.getQueryParameter("invitedby"); if (referrerUid != null) { createAnonymousAccountWithReferrerInfo(referrerUid); } } }); } else { FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if (user == null && deepLink != null) { String referrerUid = deepLink.getQueryParameter("invitedby"); if (referrerUid != null) { createAnonymousAccountWithReferrerInfo(referrerUid); } } } }); }
最后再检查一个点:
去Firebase控制台的动态链接页面,确认你配置的动态链接域名(q7rxq.app.goo.gl)是正确的,并且已经关联到你的APP项目。
按照这些步骤排查,应该就能解决问题了!
内容的提问来源于stack exchange,提问作者Uncle
相关产品推荐
相关产品推荐

