|
|
# 隐私政策与应用权限功能实现报告
|
|
|
|
|
|
## 📋 概述
|
|
|
|
|
|
本报告详细记录了为MyQrCode应用添加隐私政策和应用权限管理功能的完整实现过程,包括界面设计、技术实现、本地化支持以及用户体验优化。
|
|
|
|
|
|
## 🎯 功能特性
|
|
|
|
|
|
### 1. 应用权限管理 (`AppPermissionsView.swift`)
|
|
|
|
|
|
#### 核心功能:
|
|
|
- **实时权限状态检测**:自动检测相机和相册权限状态
|
|
|
- **权限状态显示**:清晰显示当前权限状态(已授权、已拒绝、受限制、未确定、有限访问)
|
|
|
- **权限请求功能**:一键请求相机和相册权限
|
|
|
- **系统设置跳转**:快速跳转到系统设置页面
|
|
|
|
|
|
#### 技术实现:
|
|
|
```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文件
|
|
|
- **简约风格设计**:现代化的界面布局和样式
|
|
|
- **完整内容**:包含所有必要的隐私政策章节
|
|
|
|
|
|
#### 技术实现:
|
|
|
```swift
|
|
|
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直接导航到相关界面
|
|
|
|
|
|
#### 界面设计:
|
|
|
```swift
|
|
|
// 应用权限卡片
|
|
|
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`)
|
|
|
|
|
|
#### 核心功能:
|
|
|
- **系统语言跟随**:默认跟随系统语言设置
|
|
|
- **智能语言检测**:自动检测系统语言并选择对应支持的语言
|
|
|
- **手动语言选择**:用户可手动选择特定语言
|
|
|
- **语言回退机制**:如果没有对应的语言文件,自动使用英语
|
|
|
|
|
|
#### 技术实现:
|
|
|
```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**:英语
|
|
|
- **🇨🇳 中文**:简体中文
|
|
|
- **🇹🇭 ไทย**:泰文
|
|
|
|
|
|
#### 语言选择界面:
|
|
|
- **折叠式选择器**:默认显示当前选中的语言,点击后展开所有选项
|
|
|
- **视觉反馈**:选中状态有蓝色背景和勾选图标
|
|
|
- **国旗图标**:每个语言选项都有对应的国旗图标
|
|
|
- **动画效果**:展开/收起有平滑的动画过渡
|
|
|
- **空间优化**:避免语言选项过多时占用过多空间
|
|
|
|
|
|
## 📄 隐私政策内容
|
|
|
|
|
|
### HTML文件结构:
|
|
|
```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. **泰文 (th)**:完整的泰文本地化
|
|
|
|
|
|
### 本地化文件:
|
|
|
- `MyQrCode/en.lproj/Localizable.strings`:英文本地化
|
|
|
- `MyQrCode/zh-Hans.lproj/Localizable.strings`:简体中文本地化
|
|
|
- `MyQrCode/th.lproj/Localizable.strings`:泰文本地化
|
|
|
|
|
|
### 新增本地化字符串:
|
|
|
```strings
|
|
|
"system_language" = "System"; // 英文
|
|
|
"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等)
|
|
|
- 支持泰文检测(th)
|
|
|
- 其他语言默认使用英语
|
|
|
|
|
|
### 语言状态管理:
|
|
|
- 使用UserDefaults保存语言设置
|
|
|
- 区分手动设置和系统跟随状态
|
|
|
- 支持动态语言切换和UI刷新
|
|
|
|
|
|
### 导航优化:
|
|
|
- 移除双重NavigationView问题
|
|
|
- 使用NavigationLink提供直接导航
|
|
|
- 简化子视图的导航标题设置
|
|
|
|
|
|
## 📝 总结
|
|
|
|
|
|
本次更新成功为MyQrCode应用添加了完整的隐私政策和应用权限管理功能,包括:
|
|
|
|
|
|
1. **完整的权限管理界面**,支持实时状态显示和权限操作
|
|
|
2. **简约风格的隐私政策界面**,使用HTML格式提供现代化的英文版隐私政策
|
|
|
3. **无缝的设置界面集成**,使用NavigationLink提供直接的导航体验
|
|
|
4. **智能的语言本地化系统**,支持系统语言跟随和手动语言选择
|
|
|
5. **全面的本地化支持**,支持英文、中文和泰文三种语言
|
|
|
6. **现代化的界面设计**,提供优秀的用户体验
|
|
|
|
|
|
### 主要改进:
|
|
|
- **隐私政策HTML**:改为简约风格设计,使用渐变头部和现代化的布局
|
|
|
- **导航方式**:从sheet模态展示改为NavigationLink直接导航,提供更流畅的用户体验
|
|
|
- **语言系统**:添加系统语言跟随功能,智能检测系统语言并自动选择对应支持的语言
|
|
|
- **语言选择器**:改为折叠式设计,默认收起,点击展开,避免占用过多空间
|
|
|
- **界面优化**:移除了不必要的dismiss相关代码,简化了导航逻辑
|
|
|
- **用户体验**:解决双重导航栏问题,提供更清晰的导航层次
|
|
|
|
|
|
所有功能都已通过编译验证,可以立即投入使用。这些功能将帮助应用更好地管理用户权限,提供透明的隐私政策,智能地适应不同语言环境,并符合现代应用的法律和用户体验要求。
|