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

MAUI iOS应用添加ATT授权遇问题:配置完成无弹窗

MAUI iOS 无法弹出App Tracking Transparency(ATT)授权弹窗

我正在为iOS平台的MAUI应用添加ATT授权,已在MainPage.xaml.cs的OnAppearing方法中添加以下代码:

protected override void OnAppearing()
{
    base.OnAppearing();

    // Prompt the user for tracking authorization
    ATTrackingManager.RequestTrackingAuthorization(async (status) =>
    {
        string message = "";
        // Handle the user's authorization status here
        switch (status)
        {
            case ATTrackingManagerAuthorizationStatus.Authorized:
                message = "Authorized";
                await Application.Current.MainPage.DisplayAlert("Authorization Status", message, "OK");
                break; 

            case ATTrackingManagerAuthorizationStatus.Denied:
                message = "Denied";
                await Application.Current.MainPage.DisplayAlert("Authorization Status", message, "OK");
                break; 

            case ATTrackingManagerAuthorizationStatus.Restricted:
                message = "Restricted";
                await Application.Current.MainPage.DisplayAlert("Authorization Status", message, "OK");
                break; 

            case ATTrackingManagerAuthorizationStatus.NotDetermined:
                message = "NotDetermined";
                await Application.Current.MainPage.DisplayAlert("Authorization Status", message, "OK");
                break; 
        }
    });
}

同时在Platforms/iOS/Info.plist中添加配置:

<key>NSUserTrackingUsageDescription</key>
<string>This app uses data to deliver personalized advertising.</string>

操作后无报错,但始终无法弹出苹果官方的ATT授权弹窗,期望出现标准授权提示界面。


解决方法

1. 强制在主线程执行授权请求

ATTrackingManager.RequestTrackingAuthorization必须在iOS主线程调用,异步回调中操作UI也需要切回主线程,修改代码如下:

protected override void OnAppearing()
{
    base.OnAppearing();

    MainThread.BeginInvokeOnMainThread(() =>
    {
        ATTrackingManager.RequestTrackingAuthorization((status) =>
        {
            string message = status switch
            {
                ATTrackingManagerAuthorizationStatus.Authorized => "已授权",
                ATTrackingManagerAuthorizationStatus.Denied => "已拒绝",
                ATTrackingManagerAuthorizationStatus.Restricted => "受限制",
                ATTrackingManagerAuthorizationStatus.NotDetermined => "未确定",
                _ => "未知状态"
            };

            MainThread.BeginInvokeOnMainThread(async () =>
            {
                await Application.Current.MainPage.DisplayAlert("授权状态", message, "确定");
            });
        });
    });
}

2. 确认iOS版本兼容性

ATT框架仅支持iOS 14.0及以上版本,测试设备或模拟器系统版本低于iOS 14时,授权弹窗不会触发,需确保测试环境满足版本要求。

3. 验证Info.plist配置

  • 检查NSUserTrackingUsageDescription键名无拼写错误(注意大小写和符号)
  • 描述文本需明确说明跟踪用途,不能为空或过于简略,否则苹果可能屏蔽弹窗
  • 确认修改的是MAUI项目中Platforms/iOS/Info.plist文件,而非共享项目中的其他配置

4. 避免模拟器测试限制

iOS模拟器中ATT弹窗可能无法正常显示,建议使用真实iOS设备测试。若必须用模拟器:

  • 执行Device > Erase All Content and Settings重置模拟器
  • 在模拟器设置 > 隐私与安全性 > 跟踪中手动开启权限

5. 检查授权状态是否已确定

若用户已做出过授权选择(允许/拒绝),RequestTrackingAuthorization不会再次弹窗,可先检查状态:

protected override void OnAppearing()
{
    base.OnAppearing();

    MainThread.BeginInvokeOnMainThread(() =>
    {
        var currentStatus = ATTrackingManager.TrackingAuthorizationStatus;
        if (currentStatus == ATTrackingManagerAuthorizationStatus.NotDetermined)
        {
            ATTrackingManager.RequestTrackingAuthorization((status) =>
            {
                // 处理状态逻辑
            });
        }
        else
        {
            MainThread.BeginInvokeOnMainThread(async () =>
            {
                await Application.Current.MainPage.DisplayAlert("提示", "请前往设置修改跟踪权限", "确定");
            });
        }
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:55:49