Отклонение в App Store из-за рекомендации 5.1.2 — Проблемы с согласием AdMob и разрешениями на отслеживание в приложении Flutter

Недавно я опубликовал свое приложение Flutter в App Store, и оно изначально было принято. Приложение включало формы согласия AdMob и рекламные коды, но во время первой проверки я не подключил AdMob к своему приложению на панели управления AdMob. Вероятно, из-за этого форма согласия GDPR не отображалась, что позволило приложению пройти первоначальную проверку.

Однако обновление моего приложения было отклонено в соответствии с руководящим принципом 5.1.2 — Юридическая информация — Конфиденциальность — Использование и обмен данными. Вот скриншот уведомления об отказе, на котором отмечена проблема с формой согласия.

Я не знаю, как поступить, и мне нужны советы. В частности, меня смущает правильный подход к обработке форм согласия и отслеживанию разрешений. Вот мои вопросы и понимание:

  • Должен ли я сначала отображать диалоговое окно разрешения 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.permanallyDenied.

После исследования я увидел, что если текущий статус отслеживания — 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;
}

Я вижу диалоговое окно «Разрешение отклонено — Открыть настройки», но когда я перехожу к настройкам, опция отслеживания отсутствует. Я также проверил Настройки -> Конфиденциальность и безопасность -> Отслеживание, и моего приложения там нет.

В чем моя ошибка? Правилен ли мой подход к показу формы согласия после разрешения отслеживания, и если да, то в чем моя ошибка в кодах или я совершенно не прав?

Спасибо за помощь!

Диалоговое окно относится к «настройкам устройства», а не к настройкам вашего приложения. В разделе «Конфиденциальность» в настройках пользователи могут установить по умолчанию запрос приложениям не отслеживать. Если этот параметр включен, диалоговое окно запроса на отслеживание не отображается. В отслеживании просто отказано.

Paulw11 18.07.2024 23:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ОБНОВЛЯТЬ

Да, мой подход правильный. Если вы хотите использовать рекламу AdMob с формой согласия GDPR в iOS, вам необходимо сначала открыть диалоговое окно «Прозрачность отслеживания», а затем вы можете показать форму согласия. Чтобы исправить отображение диалогового окна «Прозрачность отслеживания», я ранее использовал пакет разрешений_handler и считаю, что это была проблема. Я изменил пакет на этот: app_tracking_transparency, и это решило мою проблему. Затем я обновил свое приложение, и оно принято.

Другие вопросы по теме