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

iOS中Deep Linking跳转指定应用页面后自动返回主页面问题求助

问题原因及解决方案

1. iOS端导航栈未初始化完成导致跳转被覆盖

OnAppLinkRequestReceived触发时,iOS端的主页面导航栈大概率还没有完全初始化,此时执行的Push操作会被后续App启动默认的导航逻辑覆盖,最终自动回退到主页。
修复方案:
将页面跳转逻辑放在主线程调度执行,确保导航栈初始化完成后再操作:

if (jobItemPage != null)
{
    jobItemPage.BindingContext = new JobDetailViewModel(int.Parse(pageParameter));
    Device.BeginInvokeOnMainThread(async () =>
    {
        if (MainPage.Navigation != null)
        {
            await MainPage.Navigation.PushAsync(jobItemPage, animated: true);
        }
    });
}

2. iOS原生层未正确处理Universal Link回调

iOS端Universal Link触发后需要在原生层手动转发回调到Forms层,如果你没有实现对应方法,系统会默认执行App启动逻辑,覆盖掉你的页面跳转操作。
修复方案:
在iOS项目中添加对应回调处理:

iOS 13以下版本,在AppDelegate.cs中添加:

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    if (userActivity.ActivityType == NSUserActivityType.BrowsingWeb && userActivity.WebPageUrl != null)
    {
        Xamarin.Forms.Application.Current.SendOnAppLinkRequestReceived(userActivity.WebPageUrl);
        return true;
    }
    return base.ContinueUserActivity(application, userActivity, completionHandler);
}

iOS 13及以上版本,在SceneDelegate.cs中添加:

public override void WillConnect(UIScene scene, UISceneSession session, UISceneConnectionOptions connectionOptions)
{
    base.WillConnect(scene, session, connectionOptions);
    var userActivity = connectionOptions.UserActivities.FirstOrDefault();
    if (userActivity?.ActivityType == NSUserActivityType.BrowsingWeb && userActivity.WebPageUrl != null)
    {
        Xamarin.Forms.Application.Current.SendOnAppLinkRequestReceived(userActivity.WebPageUrl);
    }
}

public override void ContinueUserActivity(UIScene scene, NSUserActivity userActivity)
{
    base.ContinueUserActivity(scene, userActivity);
    if (userActivity.ActivityType == NSUserActivityType.BrowsingWeb && userActivity.WebPageUrl != null)
    {
        Xamarin.Forms.Application.Current.SendOnAppLinkRequestReceived(userActivity.WebPageUrl);
    }
}

3. 代码未做异常校验导致跳转失败

你当前的代码没有做参数合法性校验,iOS端严格的运行时校验可能会因为空引用、参数解析失败触发异常,导致跳转的页面被销毁,自动回退到主页。
修复方案:
补充参数校验和异常捕获:

protected override async void OnAppLinkRequestReceived(Uri uri)
{
    try
    {
        string appDomain = "https://mydomain.com/".ToLowerInvariant();
        var uriStr = uri.ToString().ToLowerInvariant();
        if (!uriStr.StartsWith(appDomain, StringComparison.Ordinal))
            return;

        string pageUrl = uriStr.Replace(appDomain, string.Empty).Trim();
        var parts = pageUrl.Split('?');
        if (parts.Length < 2) return;
        
        string pageTypeName = parts[0];
        var pageType = Type.GetType(pageTypeName);
        if (pageType == null) return;
        
        if (!parts[1].StartsWith("id=", StringComparison.Ordinal)) return;
        if (!int.TryParse(parts[1].Replace("id=", string.Empty), out int jobId)) return;

        if (Activator.CreateInstance(pageType) is JobDetail jobItemPage)
        {
            jobItemPage.BindingContext = new JobDetailViewModel(jobId);
            Device.BeginInvokeOnMainThread(async () =>
            {
                await MainPage.Navigation.PushAsync(jobItemPage, animated: true);
            });
        }
    }
    catch (Exception ex)
    {
        // 可在此处添加日志输出排查具体错误
        Console.WriteLine($"DeepLink处理异常:{ex}");
    }
    base.OnAppLinkRequestReceived(uri);
}

4. apple-app-site-association配置校验

你当前的配置语法没有问题,需要确认两点:

  • MyTeamIdPrefix必须替换为苹果开发者账号的实际Team ID,com.deepLinking必须和iOS项目的Bundle ID完全一致,区分大小写
  • 该文件必须放在域名根目录或者.well-known目录下,访问路径为https://mydomain.com/.well-known/apple-app-site-association,不能有跳转,返回的Content-Type必须为application/json

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:06:01