因准则 5.1.2 - Flutter 应用中的 AdMob 同意和跟踪权限问题而被 App Store 拒绝

问题描述 投票:0回答:1

我最近在 App Store 中发布了我的 Flutter 应用程序,并初步被接受。该应用程序包含 AdMob 同意书和广告代码,但在第一次审核期间我没有将 AdMob 连接到 AdMob 仪表板中的我的应用程序。这可能会导致 GDPR 同意书无法显示,从而使应用程序能够通过初步审核。

但是,由于准则 5.1.2 - 法律 - 隐私 - 数据使用和共享,我的应用程序更新被拒绝。这是拒绝通知的屏幕截图,突出显示了同意书的问题。

Apple Rejection Message

Consent Form

我不确定如何继续,需要一些指导。具体来说,我对处理同意书和跟踪权限的正确方法感到困惑。以下是我的疑问和理解:

  • 我是否应该首先显示 Apple 的跟踪权限对话框,并且只有在用户允许跟踪时才显示 GDPR 同意书?如果用户不允许跟踪,我是否应该跳过同意书并使用非个性化广告?
  • 或者,我应该跳过显示任何同意书并仅显示 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();
  });
}

当我在 iOS 设备上运行此程序时,我在控制台中看到:

当前跟踪状态:PermissionStatus.denied 或者 当前跟踪状态:PermissionStatus.permanentlyDenied

经过研究,我发现如果当前的跟踪状态是PermissionStatus.denied,则用户之前已经拒绝了权限请求。必须引导用户进入应用程序设置以手动启用跟踪权限。

我添加了这些代码:

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;
}

我看到“权限被拒绝 - 打开设置”对话框,但当我进入设置时,没有跟踪选项。我还检查了“设置”->“隐私和安全”->“跟踪”,但我的应用程序未在那里列出。

Permission Denied Popup

Phone Settings

我的错误是什么?我在允许跟踪后显示同意书的方法是否正确,如果是的话,我的代码错误是什么,或者我完全错了?

谢谢您的帮助!

ios flutter admob app-store app-store-connect
1个回答
0
投票

更新

是的,我的做法是正确的。如果您想在 iOS 中使用带有 GDPR 同意书的 AdMob 广告,您需要先显示跟踪透明度对话框,然后才能显示同意书。为了修复显示跟踪透明度对话框,我之前使用了permission_handler包,我相信这就是问题所在。我将包更改为:app_tracking_transparency,这解决了我的问题。然后我更新了我的应用程序并且它被接受了。

© www.soinside.com 2019 - 2024. All rights reserved.