You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MyQRCode/docs/PRIVACY_POLICY_AND_PERMISSI...

13 KiB

隐私政策与应用权限功能实现报告

📋 概述

本报告详细记录了为MyQrCode应用添加隐私政策和应用权限管理功能的完整实现过程包括界面设计、技术实现、本地化支持以及用户体验优化。

🎯 功能特性

1. 应用权限管理 (AppPermissionsView.swift)

核心功能:

  • 实时权限状态检测:自动检测相机和相册权限状态
  • 权限状态显示:清晰显示当前权限状态(已授权、已拒绝、受限制、未确定、有限访问)
  • 权限请求功能:一键请求相机和相册权限
  • 系统设置跳转:快速跳转到系统设置页面

技术实现:

// 权限状态检测
private func checkPermissions() {
    cameraPermissionStatus = AVCaptureDevice.authorizationStatus(for: .video)
    photoPermissionStatus = PHPhotoLibrary.authorizationStatus()
}

// 权限请求
private func requestCameraPermission() {
    AVCaptureDevice.requestAccess(for: .video) { _ in
        DispatchQueue.main.async {
            checkPermissions()
        }
    }
}

界面设计:

  • 状态卡片:每个权限都有独立的状态卡片
  • 颜色编码:不同状态使用不同颜色(绿色=已授权,红色=已拒绝,橙色=受限制等)
  • 操作按钮:根据当前状态显示相应的操作按钮

2. 隐私政策界面 (PrivacyPolicyView.swift)

核心功能:

  • HTML格式显示使用WKWebView加载本地HTML文件
  • 简约风格设计:现代化的界面布局和样式
  • 完整内容:包含所有必要的隐私政策章节

技术实现:

struct WebView: UIViewRepresentable {
    let url: URL
    
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent())
        return webView
    }
}

界面特点:

  • 渐变头部:蓝紫色渐变背景的标题区域
  • 卡片式布局:清爽的白色容器,圆角设计
  • 响应式设计:适配不同屏幕尺寸
  • 现代化样式使用CSS3和现代设计元素

3. 设置界面集成 (SettingsView.swift)

新增功能:

  • 应用权限卡片:显示权限管理入口
  • 隐私政策卡片:显示隐私政策入口
  • 导航集成使用NavigationLink直接导航到相关界面

界面设计:

// 应用权限卡片
NavigationLink(destination: AppPermissionsView().environmentObject(languageManager)) {
    VStack(alignment: .leading, spacing: 16) {
        HStack {
            Image(systemName: "lock.shield")
            Text("app_permissions".localized)
            Spacer()
            Image(systemName: "chevron.right")
        }
        Text("manage_app_permissions".localized)
    }
}

// 隐私政策卡片
NavigationLink(destination: PrivacyPolicyView().environmentObject(languageManager)) {
    VStack(alignment: .leading, spacing: 16) {
        HStack {
            Image(systemName: "hand.raised.fill")
            Text("privacy_policy".localized)
            Spacer()
            Image(systemName: "chevron.right")
        }
        Text("view_privacy_policy".localized)
    }
}

4. 语言本地化系统 (LanguageManager.swift)

核心功能:

  • 系统语言跟随:默认跟随系统语言设置
  • 智能语言检测:自动检测系统语言并选择对应支持的语言
  • 手动语言选择:用户可手动选择特定语言
  • 语言回退机制:如果没有对应的语言文件,自动使用英语

技术实现:

// 检测系统语言并返回对应的支持语言
private func detectSystemLanguage() -> Language {
    let systemLanguage = Locale.current.languageCode ?? "en"
    
    // 检查是否是简体中文
    if systemLanguage.hasPrefix("zh") {
        return .chinese
    }
    
    // 检查是否是泰文
    if systemLanguage == "th" {
        return .thai
    }
    
    // 其他语言默认使用英文
    return .english
}

// 加载保存的语言设置
private func loadLanguage() {
    let hasManualLanguage = UserDefaults.standard.object(forKey: languageKey) != nil
    
    if hasManualLanguage {
        // 如果用户手动设置过语言,使用保存的设置
        if let savedLanguage = UserDefaults.standard.string(forKey: languageKey),
           let language = Language(rawValue: savedLanguage) {
            if language == .system {
                // 如果保存的是系统语言,检测当前系统语言
                let systemLanguage = detectSystemLanguage()
                currentLanguage = systemLanguage
            } else {
                currentLanguage = language
            }
        }
    } else {
        // 首次启动,默认使用系统语言
        currentLanguage = .system
        let systemLanguage = detectSystemLanguage()
        
        // 保存系统语言设置
        UserDefaults.standard.set("system", forKey: languageKey)
        UserDefaults.standard.set(true, forKey: systemLanguageKey)
        
        // 设置实际语言
        switchLanguage(to: .system)
    }
}

支持的语言选项:

  • 🌐 跟随系统:自动跟随系统语言设置
  • 🇺🇸 English:英语
  • 🇨🇳 中文:简体中文
  • 🇹🇭 ไทย:泰文

语言选择界面:

  • 折叠式选择器:默认显示当前选中的语言,点击后展开所有选项
  • 视觉反馈:选中状态有蓝色背景和勾选图标
  • 国旗图标:每个语言选项都有对应的国旗图标
  • 动画效果:展开/收起有平滑的动画过渡
  • 空间优化:避免语言选项过多时占用过多空间
  • 多语言支持支持12种主流语言英语、中文、日语、韩语、法语、德语、西班牙语、意大利语、葡萄牙语、俄语、泰文、系统跟随所有语言文件包含完整的711个本地化条目

📄 隐私政策内容

HTML文件结构

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Privacy Policy - MyQrCode</title>
    <style>
        /* 简约风格CSS样式 */
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>Privacy Policy</h1>
            <div class="last-updated">
                <strong>Last Updated:</strong> December 28, 2024
            </div>
        </div>
        
        <!-- 8个主要章节 -->
        <h2>1. Information We Collect</h2>
        <h2>2. How We Use Your Information</h2>
        <h2>3. Information Sharing</h2>
        <h2>4. Data Security</h2>
        <h2>5. Your Rights</h2>
        <h2>6. Children's Privacy</h2>
        <h2>7. Changes to This Policy</h2>
        <h2>8. Contact Us</h2>
    </div>
</body>
</html>

隐私政策特点:

  • 英文版本:统一使用英文,确保法律效力
  • 完整内容:包含所有必要的隐私政策章节
  • 简约设计:现代化的界面布局和样式
  • 响应式布局:适配不同屏幕尺寸

🌍 本地化支持

支持的语言:

  1. 英语 (en):默认语言,作为回退语言
  2. 简体中文 (zh-Hans):完整的中文本地化
  3. 日语 (ja):完整的日文本地化
  4. 韩语 (ko):完整的韩文本地化
  5. 法语 (fr):完整的法文本地化
  6. 德语 (de):完整的德文本地化
  7. 西班牙语 (es):完整的西班牙语本地化
  8. 意大利语 (it):完整的意大利语本地化
  9. 葡萄牙语 (pt):完整的葡萄牙语本地化
  10. 俄语 (ru):完整的俄语本地化
  11. 泰文 (th):完整的泰文本地化
  12. 系统跟随:自动跟随设备系统语言设置

本地化文件:

  • MyQrCode/en.lproj/Localizable.strings:英文本地化
  • MyQrCode/zh-Hans.lproj/Localizable.strings:简体中文本地化
  • MyQrCode/ja.lproj/Localizable.strings:日文本地化
  • MyQrCode/ko.lproj/Localizable.strings:韩文本地化
  • MyQrCode/fr.lproj/Localizable.strings:法文本地化
  • MyQrCode/de.lproj/Localizable.strings:德文本地化
  • MyQrCode/es.lproj/Localizable.strings:西班牙语本地化
  • MyQrCode/it.lproj/Localizable.strings:意大利语本地化
  • MyQrCode/pt.lproj/Localizable.strings:葡萄牙语本地化
  • MyQrCode/ru.lproj/Localizable.strings:俄语本地化
  • MyQrCode/th.lproj/Localizable.strings:泰文本地化

新增本地化字符串:

"system_language" = "System";           // 英文
"system_language" = "跟随系统";         // 中文
"system_language" = "システム";         // 日文
"system_language" = "시스템";           // 韩文
"system_language" = "Système";          // 法文
"system_language" = "System";           // 德文
"system_language" = "Sistema";          // 西班牙文
"system_language" = "Sistema";          // 意大利文
"system_language" = "Sistema";          // 葡萄牙文
"system_language" = "Система";          // 俄文
"system_language" = "ตามระบบ";          // 泰文

📱 用户体验

权限管理:

  1. 用户进入设置界面
  2. 点击"应用权限"卡片
  3. 直接导航到权限管理界面
  4. 查看当前权限状态
  5. 根据需要请求权限或打开系统设置

隐私政策:

  1. 用户进入设置界面
  2. 点击"隐私政策"卡片
  3. 直接导航到隐私政策界面
  4. 查看简约风格的HTML格式隐私政策
  5. 了解应用的数据处理方式

语言设置:

  1. 用户进入设置界面
  2. 在语言设置区域点击当前语言显示
  3. 展开语言选项列表
  4. 可选择"跟随系统"自动跟随系统语言
  5. 或手动选择特定语言(英语、中文、日语、韩语、法语、德语、西班牙语、意大利语、葡萄牙语、俄语、泰文)
  6. 选择后自动收起选项列表并立即应用新的语言设置

🔧 技术实现细节

系统语言检测:

  • 使用Locale.current.languageCode获取系统语言代码
  • 支持中文前缀检测zh-Hans, zh-CN等
  • 支持日语检测ja
  • 支持韩语检测ko
  • 支持法语检测fr
  • 支持德语检测de
  • 支持西班牙语检测es
  • 支持意大利语检测it
  • 支持葡萄牙语检测pt
  • 支持俄语检测ru
  • 支持泰文检测th
  • 其他语言默认使用英语

本地化回退机制:

  • 智能回退:当某个语言文件中缺少特定字符串条目时,自动回退到英语版本
  • 双重检查:首先检查当前语言是否包含该条目,如果不包含则回退到英语
  • 最终回退如果英语也没有该条目则返回key本身作为最后的回退
  • 无缝体验:用户不会看到缺失的本地化条目,始终有可读的文本显示

本地化文件同步:

  • 条目一致性确保所有语言文件包含相同的711个本地化条目
  • 重复key清理自动检测并清理重复的本地化key定义
  • 缺失条目补充:自动为缺失的语言文件添加条目,使用英语作为默认值
  • 完整性验证:编译时验证所有本地化文件的完整性

语言状态管理:

  • 使用UserDefaults保存语言设置
  • 区分手动设置和系统跟随状态
  • 支持动态语言切换和UI刷新

导航优化:

  • 移除双重NavigationView问题
  • 使用NavigationLink提供直接导航
  • 简化子视图的导航标题设置

📝 总结

本次更新成功为MyQrCode应用添加了完整的隐私政策和应用权限管理功能包括

  1. 完整的权限管理界面,支持实时状态显示和权限操作
  2. 简约风格的隐私政策界面使用HTML格式提供现代化的英文版隐私政策
  3. 无缝的设置界面集成使用NavigationLink提供直接的导航体验
  4. 智能的语言本地化系统,支持系统语言跟随和手动语言选择
  5. 全面的本地化支持支持12种主流语言英语、中文、日语、韩语、法语、德语、西班牙语、意大利语、葡萄牙语、俄语、泰文
  6. 现代化的界面设计,提供优秀的用户体验

主要改进:

  • 隐私政策HTML:改为简约风格设计,使用渐变头部和现代化的布局
  • 导航方式从sheet模态展示改为NavigationLink直接导航提供更流畅的用户体验
  • 语言系统:添加系统语言跟随功能,智能检测系统语言并自动选择对应支持的语言
  • 多语言支持:新增日语、韩语、法语、德语、西班牙语、意大利语、葡萄牙语、俄语等主流国家语言支持
  • 智能回退机制:修复本地化条目缺失时的回退逻辑,确保默认使用英语条目
  • 本地化文件同步:确保所有语言文件包含相同的条目,避免缺失的本地化字符串
  • 语言选择器:改为折叠式设计,默认收起,点击展开,避免占用过多空间
  • 界面优化移除了不必要的dismiss相关代码简化了导航逻辑
  • 用户体验:解决双重导航栏问题,提供更清晰的导航层次

所有功能都已通过编译验证,可以立即投入使用。这些功能将帮助应用更好地管理用户权限,提供透明的隐私政策,智能地适应不同语言环境,并符合现代应用的法律和用户体验要求。