Xamarin.Android 生成 Firebase ShortDynamicLink 失败求解决方案
问题根因
- 短链生成需要Firebase服务端校验参数,你原有代码中
DynamicLink.AndroidParameters.Builder()未传入应用包名,是最常见的失败原因,长链不需要服务端校验包名即可生成,所以不会触发该问题。 - 原有错误分支未输出异常详情,无法定位具体问题,可先在
OnComplete的失败分支添加Console.WriteLine(task.Exception?.ToString())查看具体报错信息,域名配置错误、Firebase配置文件不匹配、网络问题都可能导致生成失败。
修正方案
1. TaskCompletionSource用法说明
TaskCompletionSource<string>是用于将Java端回调式API封装为.NET异步Task的工具,不需要传入预设值,直接在调用处实例化新对象即可,通过它可以把异步回调的结果转换成可以await的Task,更符合.NET开发习惯。
2. 完整实现代码
修正后的DynamicUrl类实现
[assembly: Xamarin.Forms.Dependency(typeof(DynamicUrl))] class DynamicUrl : IMakeDynamicUrl { // 替换为你自己的动态链接域名和应用包名 private const string MyDomain = "你的Firebase动态链接域名"; private const string Package = "你的安卓应用包名"; private Uri getPromotionDeepLink(string page) { // 保留你原有深链生成逻辑 return new Uri($"https://你的自定义域名/{page}"); } // 方法改为异步返回短链结果 public async Task<string> MakeDynamicURLAsync(string page) { // 直接实例化新的TaskCompletionSource即可 var tcs = new TaskCompletionSource<string>(); FirebaseDynamicLinks.Instance.CreateDynamicLink() .SetLink(getPromotionDeepLink(page)) .SetDomainUriPrefix(MyDomain) // 必须传入应用包名 .SetAndroidParameters(new DynamicLink.AndroidParameters.Builder(Package).Build()) .BuildShortDynamicLink() // 同时添加成功、失败监听器 .AddOnSuccessListener(new OnSuccessListner(tcs)) .AddOnFailureListener(new OnFailureListener(tcs)); // 等待回调返回结果 return await tcs.Task; } }
新增失败监听器实现
class OnFailureListener : Java.Lang.Object, IOnFailureListener { private readonly TaskCompletionSource<string> _tcs; public OnFailureListener(TaskCompletionSource<string> tcs) { _tcs = tcs; } public void OnFailure(Java.Lang.Exception e) { // 将异常传递到.NET端处理 _tcs.TrySetException(e); } }
成功监听器无需修改
class OnSuccessListner : Java.Lang.Object, IOnSuccessListener { TaskCompletionSource<string> _tcs; public OnSuccessListner(TaskCompletionSource<string> tcs) { _tcs = tcs; } void IOnSuccessListener.OnSuccess(Java.Lang.Object result) { var link = result.JavaCast<IShortDynamicLink>(); _tcs.TrySetResult(link.ShortLink.ToString()); } }
3. 调用示例
try { var shortLink = await DependencyService.Get<IMakeDynamicUrl>().MakeDynamicURLAsync("目标页面参数"); // 短链生成成功后的业务逻辑 } catch (Exception ex) { // 短链生成失败的处理逻辑 Console.WriteLine($"短链生成失败:{ex.Message}"); }
其他排查点
- 确认
google-services.json文件已正确添加到安卓项目,且生成操作设置为GoogleServicesJson - 确认Firebase控制台已开启动态链接服务,配置的域名和代码中
MyDomain完全一致 - 确认应用包名和Firebase控制台注册的安卓应用包名完全匹配
- 确认测试设备网络正常,可访问Firebase服务
内容的提问来源于stack exchange,提问作者장주명
相关产品推荐
相关产品推荐

