📚 辅助资料
版本 GroMore

🔒 隐私合规

处理用户隐私保护和 GDPR 合规要求。

GDPR 合规设置

class AdPrivacyManager {
  static bool _hasUserConsent = false;
  static bool _limitPersonalAds = false;
  
  // 设置用户同意状态
  static void setUserConsent(bool hasConsent) {
    _hasUserConsent = hasConsent;
    _limitPersonalAds = !hasConsent;
    
    // 重新初始化SDK以应用新的隐私设置
    _reinitializeSDKWithPrivacySettings();
  }
  
  static Future<void> _reinitializeSDKWithPrivacySettings() async {
    await GromoreAds.initAd(
      'your_app_id',
      useMediation: true,
      debugMode: kDebugMode,
      // 只在需要限制个性化广告时设置
      limitPersonalAds: _limitPersonalAds ? 1 : null,
      limitProgrammaticAds: _limitPersonalAds ? 1 : null,
    );
    
    print('SDK已根据隐私设置重新初始化');
  }
  
  // 显示隐私同意对话框
  static Future<void> showPrivacyConsentDialog(BuildContext context) async {
    return showDialog<void>(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('隐私设置'),
          content: Text(
            '为了为您提供更好的体验,我们需要获得您的同意来处理您的个人数据用于个性化广告。'
            '您可以选择同意或拒绝,这不会影响应用的基本功能。'
          ),
          actions: <Widget>[
            TextButton(
              child: Text('拒绝'),
              onPressed: () {
                setUserConsent(false);
                Navigator.of(context).pop();
              },
            ),
            TextButton(
              child: Text('同意'),
              onPressed: () {
                setUserConsent(true);
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }
}

使用方法

在应用启动时询问用户隐私同意:

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _requestPrivacyConsentIfNeeded();
    });
  }

  Future<void> _requestPrivacyConsentIfNeeded() async {
    // 检查是否需要显示隐私同意对话框
    final bool needsConsent = await _checkIfNeedsPrivacyConsent();
    if (needsConsent) {
      await AdPrivacyManager.showPrivacyConsentDialog(context);
    }
  }

  Future<bool> _checkIfNeedsPrivacyConsent() async {
    // 这里可以检查本地存储或根据地区判断是否需要隐私同意
    // 例如:欧盟地区用户需要 GDPR 同意
    return true; // 示例:总是显示
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'GroMore 广告示例',
      home: HomePage(),
    );
  }
}

隐私参数说明

参数类型说明
limitPersonalAdsint是否限制个性化广告,0:不限制,1:限制

最佳实践

  1. 透明度:清楚告知用户数据使用目的
  2. 用户选择:提供同意或拒绝的选项
  3. 功能保证:拒绝后应用基本功能不受影响
  4. 易于撤回:提供撤回同意的方法

地区化考虑

class RegionPrivacyHelper {
  // 检查用户是否在欧盟地区
  static Future<bool> isEURegion(BuildContext context) async {
    // 这里可以使用IP地理位置服务或者系统区域设置
    final locale = Localizations.localeOf(context);
    final euCountries = ['AT', 'BE', 'BG', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE'];

    return euCountries.contains(locale.countryCode);
  }
  
  // 根据地区显示合适的隐私政策
  static String getPrivacyPolicyForRegion(String countryCode) {
    switch (countryCode) {
      case 'CN':
        return '《隐私政策》';
      case 'US':
      case 'CA':
        return 'Privacy Policy';
      default:
        if (['AT', 'BE', 'BG', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE'].contains(countryCode)) {
          return 'GDPR Privacy Policy';
        }
        return 'Privacy Policy';
    }
  }
}

注意事项

  1. 法律合规: 请咨询法律专业人士确保完全符合当地法规
  2. 数据存储: 合理存储用户的隐私选择
  3. 定期检查: 定期检查和更新隐私政策
  4. 用户教育: 向用户解释为什么需要这些权限

总结

恭喜您完成了 Flutter 穿山甲广告插件的学习!现在您已经掌握了:

  • 🚀 SDK 的安装和初始化
  • 📊 事件处理和数据统计
  • 📱 多种广告类型的使用
  • ⚡ 高级的预加载和性能优化
  • 💡 生产环境的最佳实践
  • 🔒 隐私保护和合规要求

如遇到问题,请参考最佳实践文档或联系技术支持。

需要进一步协助?

与 LightCore 技术顾问沟通,获取商业化策略与集成支持。