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

Flutter应用因AdMob consent及追踪权限违反App Store 5.1.2准则遭拒排障

Flutter应用AdMob合规与iOS追踪权限问题

背景

我的Flutter应用初始通过了App Store审核,但因未在AdMob后台关联应用,导致GDPR consent表单未显示。后续更新因违反《准则5.1.2 - 法律 - 隐私 - 数据使用与共享》被拒,问题出在consent表单的处理逻辑上。

核心疑问

  • 是否应先展示Apple追踪权限弹窗,用户允许后再显示GDPR Consent Form;若拒绝则跳过表单,加载非个性化广告?
  • 或是跳过GDPR consent表单,仅展示Apple追踪权限弹窗,允许则加载个性化广告,拒绝则加载非个性化广告?

我的实现(采用第一种逻辑)

pubspec.yaml配置

permission_handler: ^11.3.0

info.plist配置

<key>NSUserTrackingUsageDescription</key>
<string>Your description for why you need the tracking permission</string>

Dart核心代码

Future<void> _requestTrackingPermission() async {
  if (Platform.isIOS) {
    var status = await Permission.appTrackingTransparency.status;
    print('Current tracking status: $status');
    if (status == PermissionStatus.denied || status == PermissionStatus.permanentlyDenied) {
      status = await Permission.appTrackingTransparency.request();
    }
    setState(() {
      _isTrackingPermissionGranted = status == PermissionStatus.granted;
    });
    _storeTrackingPermissionStatus(_isTrackingPermissionGranted);

    if (_isTrackingPermissionGranted) {
      await _requestAndShowConsentForm();
    } else {
      _storeConsentStatus(ConsentStatus.unknown);
      _loadNonPersonalizedAds();
    }
  } else if (Platform.isAndroid) {
    await _requestAndShowConsentForm();
  }
}

Future<void> _storeTrackingPermissionStatus(bool isGranted) async {
  final prefs = await SharedPreferences.getInstance();
  prefs.setBool('tracking_permission_granted', isGranted);
}

@override
void initState() {
  super.initState();
  _initializeMobileAds();
  _requestTrackingPermission();
  _loadItems();
  _loadDarkModePreference();
  _loadLocalePreference();
  WidgetsBinding.instance.addPostFrameCallback((_) async {
    await _showAppOpenAd();
  });
}

后续优化(处理权限拒绝场景)

新增跳转应用设置代码

Future<void> _openAppSettings() async {
  bool opened = await openAppSettings();
  if (!opened) {
    print("Failed to open app settings.");
  }
}

更新后的_requestTrackingPermission方法

Future<void> _requestTrackingPermission() async {
  if (Platform.isIOS) {
    var status = await Permission.appTrackingTransparency.status;
    print('Current tracking status: $status');
    if (status == PermissionStatus.denied || status == PermissionStatus.permanentlyDenied) {
      bool userConfirmed = await _showPermissionDialog();
      if (userConfirmed) {
        await _openAppSettings();
      }
    } else if (status != PermissionStatus.granted) {
      status = await Permission.appTrackingTransparency.request();
    }
    setState(() {
      _isTrackingPermissionGranted = status == PermissionStatus.granted;
    });
    _storeTrackingPermissionStatus(_isTrackingPermissionGranted);

    if (_isTrackingPermissionGranted) {
      await _requestAndShowConsentForm();
    } else {
      _storeConsentStatus(ConsentStatus.unknown);
      _loadNonPersonalizedAds();
    }
  } else if (Platform.isAndroid) {
    await _requestAndShowConsentForm();
  }
}

Future<bool> _showPermissionDialog() async {
  return showDialog<bool>(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text('Tracking Permission Required'),
        content: Text('This app requires tracking permission to show personalized ads. Please enable it in the app settings.'),
        actions: [
          TextButton(
            onPressed: () {
              Navigator.of(context).pop(false);
            },
            child: Text('Cancel'),
          ),
          TextButton(
            onPressed: () {
              Navigator.of(context).pop(true);
            },
            child: Text('Open Settings'),
          ),
        ],
      );
    },
  ) ?? false;
}

当前遇到的问题

现在能正常弹出权限提示对话框,但进入应用设置页面后没有追踪权限选项,且在系统「设置-隐私与安全性-追踪」列表中找不到我的应用。

提问

请问我的处理逻辑是否正确?若逻辑正确,代码或配置环节存在什么问题?

内容的提问来源于stack exchange,提问作者Serkan Tarakcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:55:54