Недавно я опубликовал свое приложение Flutter в App Store, и оно изначально было принято. Приложение включало формы согласия AdMob и рекламные коды, но во время первой проверки я не подключил AdMob к своему приложению на панели управления AdMob. Вероятно, из-за этого форма согласия GDPR не отображалась, что позволило приложению пройти первоначальную проверку.
Однако обновление моего приложения было отклонено в соответствии с руководящим принципом 5.1.2 — Юридическая информация — Конфиденциальность — Использование и обмен данными. Вот скриншот уведомления об отказе, на котором отмечена проблема с формой согласия.
Я не знаю, как поступить, и мне нужны советы. В частности, меня смущает правильный подход к обработке форм согласия и отслеживанию разрешений. Вот мои вопросы и понимание:
Я считаю, что первый подход верен. Чтобы реализовать это, я добавил следующее:
В 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;
}
Я вижу диалоговое окно «Разрешение отклонено — Открыть настройки», но когда я перехожу к настройкам, опция отслеживания отсутствует. Я также проверил Настройки -> Конфиденциальность и безопасность -> Отслеживание, и моего приложения там нет.
В чем моя ошибка? Правилен ли мой подход к показу формы согласия после разрешения отслеживания, и если да, то в чем моя ошибка в кодах или я совершенно не прав?
Спасибо за помощь!
ОБНОВЛЯТЬ
Да, мой подход правильный. Если вы хотите использовать рекламу AdMob с формой согласия GDPR в iOS, вам необходимо сначала открыть диалоговое окно «Прозрачность отслеживания», а затем вы можете показать форму согласия. Чтобы исправить отображение диалогового окна «Прозрачность отслеживания», я ранее использовал пакет разрешений_handler и считаю, что это была проблема. Я изменил пакет на этот: app_tracking_transparency, и это решило мою проблему. Затем я обновил свое приложение, и оно принято.
Диалоговое окно относится к «настройкам устройства», а не к настройкам вашего приложения. В разделе «Конфиденциальность» в настройках пользователи могут установить по умолчанию запрос приложениям не отслеживать. Если этот параметр включен, диалоговое окно запроса на отслеживание не отображается. В отслеживании просто отказано.