You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者장주명

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:36:03