我最近在 App Store 中发布了我的 Flutter 应用程序,并初步被接受。该应用程序包含 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.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;
}
我看到“权限被拒绝 - 打开设置”对话框,但当我进入设置时,没有跟踪选项。我还检查了“设置”->“隐私和安全”->“跟踪”,但我的应用程序未在那里列出。
我的错误是什么?我在允许跟踪后显示同意书的方法是否正确,如果是的话,我的代码错误是什么,或者我完全错了?
谢谢您的帮助!
更新
是的,我的做法是正确的。如果您想在 iOS 中使用带有 GDPR 同意书的 AdMob 广告,您需要先显示跟踪透明度对话框,然后才能显示同意书。为了修复显示跟踪透明度对话框,我之前使用了permission_handler包,我相信这就是问题所在。我将包更改为:app_tracking_transparency,这解决了我的问题。然后我更新了我的应用程序并且它被接受了。