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

如何在.NET MAUI中为Branch.io延迟深度链接创建监听器?

.NET MAUI 中 Branch.io 延迟深度链接实现方案

关于 callback 的理解

你对callback的推测完全正确——它就是用户完成应用安装/打开操作后,用来处理深度链接附带参数的回调函数。当用户通过Branch链接触发应用安装,首次打开时,Branch会把链接中的参数传递给这个回调,你可以在这里解析数据并执行后续业务逻辑。

监听器的作用与优势

Branch提到的「监听器」是全局的深度链接事件监听机制,比单独用DeepLinkHandlerPage作为入口更可靠:如果仅依赖单一页面处理,可能会因为应用启动流程的时序问题(比如页面还未加载完成,Branch的参数已经返回)导致数据丢失,也就是所谓的竞态条件。监听器可以在应用启动初期就注册,确保不会错过任何深度链接事件。

完整实现代码示例

1. 初始化 Branch SDK 并注册监听器(MauiProgram.cs)

先确保已安装Branch的NuGet包,然后在应用启动时完成初始化与监听器注册:

using BranchXamarinSDK;

public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp<App>()
        .ConfigureFonts(fonts =>
        {
            fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
        });

    // 初始化 Branch SDK(替换为你的Branch密钥)
    BranchAndroid.Init(Android.App.Application.Context, "YOUR_BRANCH_KEY");
    BranchIOS.Init("YOUR_BRANCH_KEY");

    // 注册深度链接监听器
    var branchSession = Branch.GetInstance();
    branchSession.InitSession(
        (parameters, error) =>
        {
            if (error == null && parameters != null && parameters.Count > 0)
            {
                // 切换到UI线程处理页面跳转
                App.Current.MainPage.Dispatcher.Dispatch(() =>
                {
                    ProcessDeepLinkParams(parameters);
                });
            }
        },
        Platform.CurrentActivity?.Intent ?? null
    );

    return builder.Build();
}

// 全局处理深度链接参数的方法
private static void ProcessDeepLinkParams(Dictionary<string, object> parameters)
{
    // 解析深度链接路径
    if (parameters.TryGetValue("$deeplink_path", out var pathObj) && pathObj is string deepLinkPath)
    {
        switch (deepLinkPath)
        {
            case "/article":
                // 获取文章ID并跳转对应页面
                if (parameters.TryGetValue("article_id", out var articleIdObj) && articleIdObj is string articleId)
                {
                    App.Current.MainPage.Navigation.PushAsync(new ArticlePage(articleId));
                }
                break;
            case "/product":
                // 获取产品ID并跳转对应页面
                if (parameters.TryGetValue("product_id", out var productIdObj) && productIdObj is string productId)
                {
                    App.Current.MainPage.Navigation.PushAsync(new ProductPage(productId));
                }
                break;
            default:
                // 未知路径默认跳转到首页
                App.Current.MainPage.Navigation.PushAsync(new MainPage());
                break;
        }
    }
}

2. Android 端后台唤醒处理(MainActivity.cs)

重写OnNewIntent方法,确保应用从后台唤醒时也能接收深度链接:

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);
    Branch.GetInstance().InitSession(
        (parameters, error) =>
        {
            if (error == null && parameters != null)
            {
                App.Current.MainPage.Dispatcher.Dispatch(() =>
                {
                    ProcessDeepLinkParams(parameters);
                });
            }
        },
        intent
    );
}

3. iOS 端补充处理(AppDelegate.cs)

重写两个方法以覆盖iOS端的深度链接场景:

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    Branch.GetInstance().ContinueUserActivity(userActivity);
    return base.ContinueUserActivity(application, userActivity, completionHandler);
}

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
    Branch.GetInstance().OpenUrl(url);
    return base.OpenUrl(application, url, sourceApplication, annotation);
}

实现建议

  • 放弃单一页面入口方案:监听器是全局触发的,能覆盖应用启动、后台唤醒等所有场景,避免页面加载时序导致的数据丢失。
  • 参数解析做容错处理:深度链接的参数可能缺失或格式异常,必须通过TryGetValue和类型判断保证代码健壮性。
  • 强制切换到UI线程:Branch的回调可能在非UI线程执行,必须通过Dispatcher确保页面跳转等操作在UI线程完成。
  • 全面测试延迟链接:用Branch的测试工具生成延迟链接,先卸载应用,点击链接安装后打开,验证参数传递与页面跳转是否正常。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:15:04