update IOS guide
update IOS guide
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
<dict>
|
||||
<key>com.apple.developer.icloud-container-identifiers</key>
|
||||
<array>
|
||||
<string>iCloud.com.uuvpn.apple</string>
|
||||
<string>iCloud.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
<key>com.apple.developer.icloud-services</key>
|
||||
<array>
|
||||
@@ -18,13 +18,13 @@
|
||||
<true/>
|
||||
<key>com.apple.developer.ubiquity-container-identifiers</key>
|
||||
<array>
|
||||
<string>iCloud.com.uuvpn.apple</string>
|
||||
<string>iCloud.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.com.uuvpn.apple</string>
|
||||
<string>group.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<true/>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.com.uuvpn.apple</string>
|
||||
<string>group.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
|
||||
@@ -102,5 +102,5 @@ public struct TypedProfile: Transferable, Codable {
|
||||
}
|
||||
|
||||
public extension UTType {
|
||||
static var profile: UTType { .init(exportedAs: "com.uuvpn.apple.profile") }
|
||||
static var profile: UTType { .init(exportedAs: "com.uuvpn.appleaman.profile") }
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import Foundation
|
||||
|
||||
public enum FilePath {
|
||||
public static let packageName = "com.uuvpn.apple"
|
||||
public static let packageName = "com.uuvpn.appleaman"
|
||||
}
|
||||
|
||||
public extension FilePath {
|
||||
|
||||
+322
-42
@@ -1,63 +1,343 @@
|
||||
# UUVPN iOS SwiftUI Application
|
||||
|
||||
A professional iOS VPN application built with SwiftUI, designed to integrate seamlessly with V2Board panel APIs. This application provides a modern, intuitive interface for VPN management with comprehensive configuration options.
|
||||
|
||||
## 项目简介
|
||||
本项目是基于 SwiftUI 开发的 iOS 应用,旨在提供直观的用户界面和流畅的交互体验。该应用支持多种功能,包括但不限于:
|
||||
## 🚀 Features
|
||||
|
||||
- **响应式 UI 设计**:适配不同屏幕尺寸。
|
||||
- **深色/浅色模式切换**:支持系统主题同步。
|
||||
- **网络请求**:基于 `URLSession` 进行 API 交互。
|
||||
- **Modern SwiftUI Interface**: Responsive design that adapts to different screen sizes
|
||||
- **Dark/Light Mode Support**: Automatic theme synchronization with system preferences
|
||||
- **V2Board API Integration**: Complete integration with V2Board panel APIs
|
||||
- **Network Management**: Advanced networking capabilities using `URLSession`
|
||||
- **Background Updates**: Automatic profile updates with background task scheduling
|
||||
- **Multi-platform Support**: iOS 15.0+ with macOS compatibility
|
||||
|
||||
## 项目结构
|
||||
## 📋 Requirements
|
||||
|
||||
├── iOS-SwiftUI-App/
|
||||
│ ├── Sources/
|
||||
│ │ ├── Views/ # 界面视图
|
||||
│ │ ├── Models/ # 数据模型
|
||||
│ │ ├── ViewModels/ # 业务逻辑
|
||||
│ │ ├── Resources/ # 静态资源
|
||||
│ ├── Tests/ # 单元测试
|
||||
│ ├── iOS-SwiftUI部署文档教程.docx # 必须阅读的部署文档
|
||||
│ ├── README.md # 项目说明文件
|
||||
│ └── Info.plist # 配置文件
|
||||
Before getting started, ensure your development environment meets the following requirements:
|
||||
|
||||
## 环境要求
|
||||
在开始使用该项目之前,请确保您的开发环境满足以下要求:
|
||||
- **Xcode**: 14.0 or later
|
||||
- **iOS Deployment Target**: 15.0 or later
|
||||
- **Swift**: 5.7+
|
||||
- **Network Access**: VPN required for Swift Package Manager dependencies
|
||||
|
||||
- Xcode 14.0 及以上版本
|
||||
- iOS 15.0 及以上
|
||||
- Swift 5.7+
|
||||
## 🏗️ Project Structure
|
||||
|
||||
## 安装与运行
|
||||
请按照以下步骤完成项目的安装与运行:
|
||||
```
|
||||
iOS-SwiftUI-Code/
|
||||
├── ApplicationLibrary/ # Core application library
|
||||
│ ├── Service/ # API services and managers
|
||||
│ │ ├── StoreManager.swift # Configuration storage manager
|
||||
│ │ └── ProfileUpdateTask.swift # Background update tasks
|
||||
│ ├── Views/ # SwiftUI view components
|
||||
│ │ ├── Dashboard/ # Dashboard interface
|
||||
│ │ ├── Profile/ # Profile management
|
||||
│ │ └── Setting/ # Settings interface
|
||||
│ └── Assets.xcassets/ # Application assets
|
||||
├── XiaoXiong/ # Main application target
|
||||
│ ├── DefaultUI/ # Default UI components
|
||||
│ └── Info.plist # Application configuration
|
||||
├── Extension/ # Network extension
|
||||
├── SystemExtension/ # System extension for macOS
|
||||
├── uuvpn.xcodeproj # Xcode project file
|
||||
└── README.md # Project documentation
|
||||
```
|
||||
|
||||
1. **克隆项目**
|
||||
```bash
|
||||
git clone https://github.com/nicolastinkl/UUVPN/tree/main/iOS-SwiftUI-Code
|
||||
cd iOS-SwiftUI-App
|
||||
## ⚙️ Installation & Setup
|
||||
|
||||
2. **安装依赖**
|
||||
### 1. Clone the Repository
|
||||
|
||||
swfit package manager (必须翻墙)
|
||||
```bash
|
||||
git clone https://github.com/nicolastinkl/UUVPN/tree/main/iOS-SwiftUI-Code
|
||||
cd iOS-SwiftUI-Code
|
||||
```
|
||||
|
||||
### 2. Install Dependencies
|
||||
|
||||
3. **打开 Xcode 并运行**
|
||||
The project uses Swift Package Manager for dependency management. **Note: VPN connection required for package resolution.**
|
||||
|
||||
• 使用 uuvpn.xcodeproj 打开项目。
|
||||
• 选择目标设备或模拟器,点击 Run 按钮。
|
||||
```bash
|
||||
# Dependencies will be automatically resolved when opening the project
|
||||
```
|
||||
|
||||
## 重要说明
|
||||
### 3. Open Project in Xcode
|
||||
|
||||
在使用该项目之前,必须阅读部署文档 iOS-SwiftUI部署文档教程.docx,文档内容包括:
|
||||
• 应用的完整部署流程
|
||||
• 关键技术实现说明
|
||||
• 可能遇到的问题及解决方案
|
||||
```bash
|
||||
open uuvpn.xcodeproj
|
||||
```
|
||||
|
||||
## 贡献指南
|
||||
Select your target device or simulator and click the **Run** button.
|
||||
|
||||
欢迎大家贡献代码,您可以通过提交 Pull Request 或 Issues 的方式提出改进建议。
|
||||
## 🔧 V2Board API Configuration
|
||||
|
||||
## 许可证
|
||||
### Base Configuration
|
||||
|
||||
本项目基于 MIT 开源许可证,详细信息请查看 LICENSE 文件。
|
||||
The application integrates with V2Board panels through a comprehensive API configuration system managed by [`StoreManager.swift`](ApplicationLibrary/Service/StoreManager.swift:17).
|
||||
|
||||
如有任何疑问,请联系开发团队或查阅项目文档。
|
||||
#### Configuration URL
|
||||
```swift
|
||||
public let configURL = "https://api.gooapis.com/api/vpnconfig.php"
|
||||
```
|
||||
|
||||
### API Endpoints Configuration
|
||||
|
||||
Configure the following API endpoints in your initialization response:
|
||||
|
||||
```json
|
||||
{
|
||||
"baseURL": "https://api.0008.uk/api/v1/",
|
||||
"baseDYURL": "https://api.gooapis.com/api/vpnnodes.php",
|
||||
"mainregisterURL": "https://lelian.app/#/register?code=",
|
||||
"paymentURL": "xxxxx",
|
||||
"telegramurl": "https://t.me/fastlink",
|
||||
"kefuurl": "https://gooapis.com/fastlink/",
|
||||
"websiteURL": "https://gooapis.com/fastlink/",
|
||||
"crisptoken": "5546c6ea-4b1e-41bc-80e4-4b6648cbca76",
|
||||
"banners": [
|
||||
"https://image.gooapis.com/api/images/12-11-56.png",
|
||||
"https://image.gooapis.com/api/images/12-44-57.png",
|
||||
"https://image.gooapis.com/api/images/12-47-03.png"
|
||||
],
|
||||
"message": "OK",
|
||||
"code": 1
|
||||
}
|
||||
```
|
||||
|
||||
### API Field Descriptions
|
||||
|
||||
| Field | Description | Usage |
|
||||
|-------|-------------|-------|
|
||||
| `baseURL` | Primary API endpoint for V2Board panel | All main API requests |
|
||||
| `baseDYURL` | Default VPN node testing endpoint | Node connectivity testing |
|
||||
| `mainregisterURL` | User registration page with referral code | User onboarding |
|
||||
| `paymentURL` | Payment gateway URL | **Critical for App Store compliance** |
|
||||
| `telegramurl` | Telegram support channel | Customer support |
|
||||
| `kefuurl` | Customer service page | Online support |
|
||||
| `websiteURL` | Official website URL | General information |
|
||||
| `crisptoken` | Crisp chat authentication token | Live chat integration |
|
||||
| `banners` | Promotional banner image URLs | Marketing content |
|
||||
| `message` | Response status message | API response validation |
|
||||
| `code` | Response status code | Success/error handling |
|
||||
|
||||
### API Request Headers
|
||||
|
||||
All API requests include the following headers for authentication and tracking:
|
||||
|
||||
```swift
|
||||
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||
request.addValue(Bundle.main.bundleIdentifier ?? "", forHTTPHeaderField: "bid")
|
||||
request.addValue(UserManager.shared.appversion, forHTTPHeaderField: "appver")
|
||||
```
|
||||
|
||||
## 🆔 Bundle Identifier (BID) Configuration
|
||||
|
||||
### Understanding Bundle Identifier
|
||||
|
||||
The Bundle Identifier (BID) is crucial for app identification and API authentication. It's referenced throughout the codebase as `Bundle.main.bundleIdentifier`.
|
||||
|
||||
### Current BID Configuration
|
||||
|
||||
Based on the [`Info.plist`](XiaoXiong/Info.plist:7) analysis, the current BID pattern is:
|
||||
```
|
||||
com.uuvpn.appleaman
|
||||
```
|
||||
|
||||
### Modifying Bundle Identifier
|
||||
|
||||
To change the Bundle Identifier for your deployment:
|
||||
|
||||
#### 1. Update Xcode Project Settings
|
||||
1. Open `uuvpn.xcodeproj` in Xcode
|
||||
2. Select the project root in the navigator
|
||||
3. Choose your target (e.g., "SFI", "SFM", "SFT")
|
||||
4. Navigate to **General** → **Identity**
|
||||
5. Update the **Bundle Identifier** field
|
||||
|
||||
#### 2. Update Info.plist References
|
||||
Search and replace all BID references in configuration files:
|
||||
|
||||
```bash
|
||||
# Search for current BID references
|
||||
grep -r "com.uuvpn.appleaman" .
|
||||
|
||||
# Update the following files:
|
||||
# - XiaoXiong/Info.plist
|
||||
# - Extension/Info.plist
|
||||
# - SystemExtension/Info.plist
|
||||
# - IntentsExtension/Info.plist
|
||||
```
|
||||
|
||||
#### 3. Update Code References
|
||||
The BID is automatically retrieved via `Bundle.main.bundleIdentifier` in:
|
||||
- [`Login.swift`](XiaoXiong/DefaultUI/View/LoginView/Login.swift:494)
|
||||
- [`HomeView.swift`](XiaoXiong/DefaultUI/View/HomeView.swift:984)
|
||||
|
||||
No code changes required as it uses the system bundle identifier.
|
||||
|
||||
### BID Validation in API
|
||||
|
||||
The server can validate requests using the BID header to ensure API calls come from authorized applications.
|
||||
|
||||
## 💳 Payment URL Logic & App Store Compliance
|
||||
|
||||
### Payment URL Length Detection
|
||||
|
||||
The application implements intelligent payment handling based on the `paymentURL` field length:
|
||||
|
||||
```swift
|
||||
// Apple Review Mode Detection
|
||||
if (paymentURLKey.count > 3) {
|
||||
// Normal payment mode - show external payment options
|
||||
// Enable subscription features
|
||||
// Show payment buttons and pricing
|
||||
} else {
|
||||
// Apple Review Mode - hide external payments
|
||||
// Comply with App Store guidelines
|
||||
// Hide sensitive payment information
|
||||
}
|
||||
```
|
||||
|
||||
### Implementation Details
|
||||
|
||||
#### Normal Mode (paymentURL.length > 3)
|
||||
- **External Payment**: Direct users to web-based payment systems
|
||||
- **Full Feature Access**: All subscription features available
|
||||
- **Payment Integration**: Complete payment flow with external providers
|
||||
|
||||
#### Apple Review Mode (paymentURL.length ≤ 3)
|
||||
- **Compliance Mode**: Hides external payment options
|
||||
- **Limited Features**: Restricted functionality during review
|
||||
- **App Store Guidelines**: Complies with Apple's payment policies
|
||||
|
||||
### Code Implementation
|
||||
|
||||
The logic is implemented across multiple view files:
|
||||
|
||||
- [`HomeView.swift`](XiaoXiong/DefaultUI/View/HomeView.swift:125): Main payment UI logic
|
||||
- [`SideMenuView.swift`](XiaoXiong/DefaultUI/View/SideMenuView.swift:119): Menu payment options
|
||||
- [`ActiveDashboardViewNewUI.swift`](XiaoXiong/DefaultUI/View/ActiveDashboardViewNewUI.swift:217): Dashboard payment handling
|
||||
|
||||
### Server-Side Configuration
|
||||
|
||||
Configure your initialization endpoint to return:
|
||||
|
||||
```json
|
||||
{
|
||||
"paymentURL": "https://your-payment-gateway.com/pay", // Normal mode
|
||||
// OR
|
||||
"paymentURL": "xx", // Apple review mode
|
||||
}
|
||||
```
|
||||
|
||||
## 🔄 Initialization Endpoint Configuration
|
||||
|
||||
### Endpoint Setup
|
||||
|
||||
The application fetches configuration from a remote endpoint on startup. This allows dynamic configuration without app updates.
|
||||
|
||||
#### Recommended Hosting
|
||||
- **Alibaba Cloud OSS**: Faster response times in China
|
||||
- **CDN Integration**: Global content delivery
|
||||
- **HTTPS Required**: Secure configuration delivery
|
||||
|
||||
### Configuration Response Format
|
||||
|
||||
```json
|
||||
{
|
||||
"baseURL": "https://your-v2board-panel.com/api/v1/",
|
||||
"baseDYURL": "https://your-node-test-endpoint.com/api/vpnnodes.php",
|
||||
"mainregisterURL": "https://your-panel.com/#/register?code=",
|
||||
"paymentURL": "https://your-payment-gateway.com/",
|
||||
"telegramurl": "https://t.me/your-support-channel",
|
||||
"kefuurl": "https://your-support-site.com/",
|
||||
"websiteURL": "https://your-website.com/",
|
||||
"crisptoken": "your-crisp-chat-token",
|
||||
"banners": [
|
||||
"https://your-cdn.com/banner1.png",
|
||||
"https://your-cdn.com/banner2.png"
|
||||
],
|
||||
"message": "OK",
|
||||
"code": 1
|
||||
}
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Configuration Error",
|
||||
"code": 0,
|
||||
"error": "Invalid request"
|
||||
}
|
||||
```
|
||||
|
||||
### Caching Strategy
|
||||
|
||||
The [`StoreManager`](ApplicationLibrary/Service/StoreManager.swift) implements local caching:
|
||||
|
||||
```swift
|
||||
// Configuration is cached locally using UserDefaults
|
||||
func storebaseURLData(data: String) {
|
||||
defaults.set(data, forKey: "baseURLKey")
|
||||
defaults.synchronize()
|
||||
}
|
||||
```
|
||||
|
||||
## 🔐 Security Considerations
|
||||
|
||||
### API Security
|
||||
- **HTTPS Only**: All API endpoints must use HTTPS
|
||||
- **Token Validation**: Implement proper token validation
|
||||
- **Rate Limiting**: Protect against API abuse
|
||||
|
||||
### Bundle Identifier Security
|
||||
- **Unique BID**: Use a unique bundle identifier for your deployment
|
||||
- **Server Validation**: Validate BID on server-side for API requests
|
||||
- **Certificate Pinning**: Consider implementing certificate pinning
|
||||
|
||||
## 🚀 Deployment Guide
|
||||
|
||||
### Pre-Deployment Checklist
|
||||
|
||||
1. **Update Bundle Identifier**: Change from default BID
|
||||
2. **Configure API Endpoints**: Set up your V2Board panel URLs
|
||||
3. **Test Payment Logic**: Verify both normal and review modes
|
||||
4. **Update App Icons**: Replace default icons with your branding
|
||||
5. **Configure Push Notifications**: Set up notification certificates
|
||||
|
||||
### Build Configuration
|
||||
|
||||
```bash
|
||||
# Clean build folder
|
||||
rm -rf ~/Library/Developer/Xcode/DerivedData
|
||||
|
||||
# Archive for distribution
|
||||
xcodebuild archive \
|
||||
-project uuvpn.xcodeproj \
|
||||
-scheme YourSchemeName \
|
||||
-archivePath YourApp.xcarchive
|
||||
```
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
We welcome contributions to improve the application. Please follow these guidelines:
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a feature branch
|
||||
3. Make your changes
|
||||
4. Submit a pull request
|
||||
|
||||
## 📄 License
|
||||
|
||||
This project is licensed under the MIT License. See the LICENSE file for details.
|
||||
|
||||
## 📞 Support
|
||||
|
||||
For technical support and questions:
|
||||
|
||||
- **GitHub Issues**: [Create an issue](https://github.com/nicolastinkl/UUVPN/issues)
|
||||
- **Documentation**: Refer to the deployment documentation in the project
|
||||
- **Community**: Join our developer community for assistance
|
||||
|
||||
---
|
||||
|
||||
**Note**: This application requires proper V2Board panel setup and valid API endpoints to function correctly. Ensure your backend infrastructure is properly configured before deployment.
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
# UUVPN iOS SwiftUI 应用程序
|
||||
|
||||
一个专业的 iOS VPN 应用程序,使用 SwiftUI 构建,专为与 V2Board 面板 API 无缝集成而设计。该应用程序为 VPN 管理提供现代化、直观的界面和全面的配置选项。
|
||||
|
||||
## 🚀 功能特性
|
||||
|
||||
- **现代化 SwiftUI 界面**:响应式设计,适配不同屏幕尺寸
|
||||
- **深色/浅色模式支持**:与系统主题自动同步
|
||||
- **V2Board API 集成**:与 V2Board 面板 API 完整集成
|
||||
- **网络管理**:使用 `URLSession` 的高级网络功能
|
||||
- **后台更新**:通过后台任务调度自动更新配置文件
|
||||
- **多平台支持**:iOS 15.0+ 并兼容 macOS
|
||||
|
||||
## 📋 环境要求
|
||||
|
||||
在开始之前,请确保您的开发环境满足以下要求:
|
||||
|
||||
- **Xcode**:14.0 或更高版本
|
||||
- **iOS 部署目标**:15.0 或更高版本
|
||||
- **Swift**:5.7+
|
||||
- **网络访问**:Swift Package Manager 依赖项需要 VPN 连接
|
||||
|
||||
## 🏗️ 项目结构
|
||||
|
||||
```
|
||||
iOS-SwiftUI-Code/
|
||||
├── ApplicationLibrary/ # 核心应用程序库
|
||||
│ ├── Service/ # API 服务和管理器
|
||||
│ │ ├── StoreManager.swift # 配置存储管理器
|
||||
│ │ └── ProfileUpdateTask.swift # 后台更新任务
|
||||
│ ├── Views/ # SwiftUI 视图组件
|
||||
│ │ ├── Dashboard/ # 仪表板界面
|
||||
│ │ ├── Profile/ # 配置文件管理
|
||||
│ │ └── Setting/ # 设置界面
|
||||
│ └── Assets.xcassets/ # 应用程序资源
|
||||
├── XiaoXiong/ # 主应用程序目标
|
||||
│ ├── DefaultUI/ # 默认 UI 组件
|
||||
│ └── Info.plist # 应用程序配置
|
||||
├── Extension/ # 网络扩展
|
||||
├── SystemExtension/ # macOS 系统扩展
|
||||
├── uuvpn.xcodeproj # Xcode 项目文件
|
||||
└── README.md # 项目文档
|
||||
```
|
||||
|
||||
## ⚙️ 安装与设置
|
||||
|
||||
### 1. 克隆仓库
|
||||
|
||||
```bash
|
||||
git clone https://github.com/nicolastinkl/UUVPN/tree/main/iOS-SwiftUI-Code
|
||||
cd iOS-SwiftUI-Code
|
||||
```
|
||||
|
||||
### 2. 安装依赖
|
||||
|
||||
项目使用 Swift Package Manager 进行依赖管理。**注意:需要 VPN 连接才能解析包。**
|
||||
|
||||
```bash
|
||||
# 打开项目时会自动解析依赖项
|
||||
```
|
||||
|
||||
### 3. 在 Xcode 中打开项目
|
||||
|
||||
```bash
|
||||
open uuvpn.xcodeproj
|
||||
```
|
||||
|
||||
选择目标设备或模拟器,然后点击 **运行** 按钮。
|
||||
|
||||
## 🔧 V2Board API 配置
|
||||
|
||||
### 基础配置
|
||||
|
||||
应用程序通过由 [`StoreManager.swift`](ApplicationLibrary/Service/StoreManager.swift:17) 管理的综合 API 配置系统与 V2Board 面板集成。
|
||||
|
||||
#### 配置 URL
|
||||
```swift
|
||||
public let configURL = "https://api.gooapis.com/api/vpnconfig.php"
|
||||
```
|
||||
|
||||
### API 端点配置
|
||||
|
||||
在初始化响应中配置以下 API 端点:
|
||||
|
||||
```json
|
||||
{
|
||||
"baseURL": "https://api.0008.uk/api/v1/",
|
||||
"baseDYURL": "https://api.gooapis.com/api/vpnnodes.php",
|
||||
"mainregisterURL": "https://lelian.app/#/register?code=",
|
||||
"paymentURL": "xxxxx",
|
||||
"telegramurl": "https://t.me/fastlink",
|
||||
"kefuurl": "https://gooapis.com/fastlink/",
|
||||
"websiteURL": "https://gooapis.com/fastlink/",
|
||||
"crisptoken": "5546c6ea-4b1e-41bc-80e4-4b6648cbca76",
|
||||
"banners": [
|
||||
"https://image.gooapis.com/api/images/12-11-56.png",
|
||||
"https://image.gooapis.com/api/images/12-44-57.png",
|
||||
"https://image.gooapis.com/api/images/12-47-03.png"
|
||||
],
|
||||
"message": "OK",
|
||||
"code": 1
|
||||
}
|
||||
```
|
||||
|
||||
### API 字段说明
|
||||
|
||||
| 字段 | 描述 | 用途 |
|
||||
|------|------|------|
|
||||
| `baseURL` | V2Board 面板的主要 API 端点 | 所有主要 API 请求 |
|
||||
| `baseDYURL` | 默认 VPN 节点测试端点 | 节点连接测试 |
|
||||
| `mainregisterURL` | 带推荐码的用户注册页面 | 用户引导 |
|
||||
| `paymentURL` | 支付网关 URL | **App Store 合规性关键** |
|
||||
| `telegramurl` | Telegram 支持频道 | 客户支持 |
|
||||
| `kefuurl` | 客服页面 | 在线支持 |
|
||||
| `websiteURL` | 官方网站 URL | 一般信息 |
|
||||
| `crisptoken` | Crisp 聊天认证令牌 | 实时聊天集成 |
|
||||
| `banners` | 推广横幅图片 URL | 营销内容 |
|
||||
| `message` | 响应状态消息 | API 响应验证 |
|
||||
| `code` | 响应状态码 | 成功/错误处理 |
|
||||
|
||||
### API 请求头
|
||||
|
||||
所有 API 请求都包含以下用于身份验证和跟踪的请求头:
|
||||
|
||||
```swift
|
||||
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||
request.addValue(Bundle.main.bundleIdentifier ?? "", forHTTPHeaderField: "bid")
|
||||
request.addValue(UserManager.shared.appversion, forHTTPHeaderField: "appver")
|
||||
```
|
||||
|
||||
## 🆔 Bundle Identifier (BID) 配置
|
||||
|
||||
### 理解 Bundle Identifier
|
||||
|
||||
Bundle Identifier (BID) 对于应用程序识别和 API 身份验证至关重要。它在整个代码库中被引用为 `Bundle.main.bundleIdentifier`。
|
||||
|
||||
### 当前 BID 配置
|
||||
|
||||
基于 [`Info.plist`](XiaoXiong/Info.plist:7) 分析,当前 BID 模式为:
|
||||
```
|
||||
com.uuvpn.appleaman
|
||||
```
|
||||
|
||||
### 修改 Bundle Identifier
|
||||
|
||||
要为您的部署更改 Bundle Identifier:
|
||||
|
||||
#### 1. 更新 Xcode 项目设置
|
||||
1. 在 Xcode 中打开 `uuvpn.xcodeproj`
|
||||
2. 在导航器中选择项目根目录
|
||||
3. 选择您的目标(例如 "SFI"、"SFM"、"SFT")
|
||||
4. 导航到 **General** → **Identity**
|
||||
5. 更新 **Bundle Identifier** 字段
|
||||
|
||||
#### 2. 更新 Info.plist 引用
|
||||
在配置文件中搜索并替换所有 BID 引用:
|
||||
|
||||
```bash
|
||||
# 搜索当前 BID 引用
|
||||
grep -r "com.uuvpn.appleaman" .
|
||||
|
||||
# 更新以下文件:
|
||||
# - XiaoXiong/Info.plist
|
||||
# - Extension/Info.plist
|
||||
# - SystemExtension/Info.plist
|
||||
# - IntentsExtension/Info.plist
|
||||
```
|
||||
|
||||
#### 3. 更新代码引用
|
||||
BID 通过以下文件中的 `Bundle.main.bundleIdentifier` 自动获取:
|
||||
- [`Login.swift`](XiaoXiong/DefaultUI/View/LoginView/Login.swift:494)
|
||||
- [`HomeView.swift`](XiaoXiong/DefaultUI/View/HomeView.swift:984)
|
||||
|
||||
由于使用系统 bundle identifier,无需更改代码。
|
||||
|
||||
### API 中的 BID 验证
|
||||
|
||||
服务器可以使用 BID 头验证请求,确保 API 调用来自授权应用程序。
|
||||
|
||||
## 💳 支付 URL 逻辑与 App Store 合规性
|
||||
|
||||
### 支付 URL 长度检测
|
||||
|
||||
应用程序基于 `paymentURL` 字段长度实现智能支付处理:
|
||||
|
||||
```swift
|
||||
// Apple 审核模式检测
|
||||
if (paymentURLKey.count > 3) {
|
||||
// 正常支付模式 - 显示外部支付选项
|
||||
// 启用订阅功能
|
||||
// 显示支付按钮和价格
|
||||
} else {
|
||||
// Apple 审核模式 - 隐藏外部支付
|
||||
// 符合 App Store 指南
|
||||
// 隐藏敏感支付信息
|
||||
}
|
||||
```
|
||||
|
||||
### 实现详情
|
||||
|
||||
#### 正常模式 (paymentURL.length > 3)
|
||||
- **外部支付**:引导用户到基于网页的支付系统
|
||||
- **完整功能访问**:所有订阅功能可用
|
||||
- **支付集成**:与外部提供商的完整支付流程
|
||||
|
||||
#### Apple 审核模式 (paymentURL.length ≤ 3)
|
||||
- **合规模式**:隐藏外部支付选项
|
||||
- **功能限制**:审核期间功能受限
|
||||
- **App Store 指南**:符合 Apple 的支付政策
|
||||
|
||||
### 代码实现
|
||||
|
||||
该逻辑在多个视图文件中实现:
|
||||
|
||||
- [`HomeView.swift`](XiaoXiong/DefaultUI/View/HomeView.swift:125):主要支付 UI 逻辑
|
||||
- [`SideMenuView.swift`](XiaoXiong/DefaultUI/View/SideMenuView.swift:119):菜单支付选项
|
||||
- [`ActiveDashboardViewNewUI.swift`](XiaoXiong/DefaultUI/View/ActiveDashboardViewNewUI.swift:217):仪表板支付处理
|
||||
|
||||
### 服务器端配置
|
||||
|
||||
配置您的初始化端点返回:
|
||||
|
||||
```json
|
||||
{
|
||||
"paymentURL": "https://your-payment-gateway.com/pay", // 正常模式
|
||||
// 或者
|
||||
"paymentURL": "xx", // Apple 审核模式
|
||||
}
|
||||
```
|
||||
|
||||
## 🔄 初始化端点配置
|
||||
|
||||
### 端点设置
|
||||
|
||||
应用程序在启动时从远程端点获取配置。这允许动态配置而无需应用程序更新。
|
||||
|
||||
#### 推荐托管
|
||||
- **阿里云 OSS**:在中国响应时间更快
|
||||
- **CDN 集成**:全球内容分发
|
||||
- **需要 HTTPS**:安全配置传输
|
||||
|
||||
### 配置响应格式
|
||||
|
||||
```json
|
||||
{
|
||||
"baseURL": "https://your-v2board-panel.com/api/v1/",
|
||||
"baseDYURL": "https://your-node-test-endpoint.com/api/vpnnodes.php",
|
||||
"mainregisterURL": "https://your-panel.com/#/register?code=",
|
||||
"paymentURL": "https://your-payment-gateway.com/",
|
||||
"telegramurl": "https://t.me/your-support-channel",
|
||||
"kefuurl": "https://your-support-site.com/",
|
||||
"websiteURL": "https://your-website.com/",
|
||||
"crisptoken": "your-crisp-chat-token",
|
||||
"banners": [
|
||||
"https://your-cdn.com/banner1.png",
|
||||
"https://your-cdn.com/banner2.png"
|
||||
],
|
||||
"message": "OK",
|
||||
"code": 1
|
||||
}
|
||||
```
|
||||
|
||||
### 错误处理
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Configuration Error",
|
||||
"code": 0,
|
||||
"error": "Invalid request"
|
||||
}
|
||||
```
|
||||
|
||||
### 缓存策略
|
||||
|
||||
[`StoreManager`](ApplicationLibrary/Service/StoreManager.swift) 实现本地缓存:
|
||||
|
||||
```swift
|
||||
// 配置使用 UserDefaults 本地缓存
|
||||
func storebaseURLData(data: String) {
|
||||
defaults.set(data, forKey: "baseURLKey")
|
||||
defaults.synchronize()
|
||||
}
|
||||
```
|
||||
|
||||
## 🔐 安全考虑
|
||||
|
||||
### API 安全
|
||||
- **仅 HTTPS**:所有 API 端点必须使用 HTTPS
|
||||
- **令牌验证**:实现适当的令牌验证
|
||||
- **速率限制**:防止 API 滥用
|
||||
|
||||
### Bundle Identifier 安全
|
||||
- **唯一 BID**:为您的部署使用唯一的 bundle identifier
|
||||
- **服务器验证**:在服务器端验证 API 请求的 BID
|
||||
- **证书固定**:考虑实现证书固定
|
||||
|
||||
## 🚀 部署指南
|
||||
|
||||
### 部署前检查清单
|
||||
|
||||
1. **更新 Bundle Identifier**:从默认 BID 更改
|
||||
2. **配置 API 端点**:设置您的 V2Board 面板 URL
|
||||
3. **测试支付逻辑**:验证正常和审核模式
|
||||
4. **更新应用图标**:用您的品牌替换默认图标
|
||||
5. **配置推送通知**:设置通知证书
|
||||
|
||||
### 构建配置
|
||||
|
||||
```bash
|
||||
# 清理构建文件夹
|
||||
rm -rf ~/Library/Developer/Xcode/DerivedData
|
||||
|
||||
# 归档用于分发
|
||||
xcodebuild archive \
|
||||
-project uuvpn.xcodeproj \
|
||||
-scheme YourSchemeName \
|
||||
-archivePath YourApp.xcarchive
|
||||
```
|
||||
|
||||
## 🤝 贡献
|
||||
|
||||
我们欢迎贡献来改进应用程序。请遵循以下指南:
|
||||
|
||||
1. Fork 仓库
|
||||
2. 创建功能分支
|
||||
3. 进行更改
|
||||
4. 提交 pull request
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
该项目基于 MIT 许可证。详细信息请查看 LICENSE 文件。
|
||||
|
||||
## 📞 支持
|
||||
|
||||
技术支持和问题:
|
||||
|
||||
- **GitHub Issues**:[创建问题](https://github.com/nicolastinkl/UUVPN/issues)
|
||||
- **文档**:参考项目中的部署文档
|
||||
- **社区**:加入我们的开发者社区获取帮助
|
||||
|
||||
---
|
||||
|
||||
**注意**:此应用程序需要正确的 V2Board 面板设置和有效的 API 端点才能正常运行。请确保在部署前正确配置您的后端基础设施。
|
||||
@@ -5,7 +5,7 @@
|
||||
<key>NetworkExtension</key>
|
||||
<dict>
|
||||
<key>NEMachServiceName</key>
|
||||
<string>group.com.uuvpn.apple.system</string>
|
||||
<string>group.com.uuvpn.appleaman.system</string>
|
||||
<key>NEProviderClasses</key>
|
||||
<dict>
|
||||
<key>com.apple.networkextension.packet-tunnel</key>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</array>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.com.uuvpn.apple</string>
|
||||
<string>group.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<false/>
|
||||
|
||||
@@ -13,7 +13,7 @@ import Foundation
|
||||
class UserManager {
|
||||
static let shared = UserManager()
|
||||
|
||||
public let configURL = "https://xxx.ocm/config.json"
|
||||
public let configURL = "https://api.gooapis.com/api/yaya/"
|
||||
|
||||
public let appversion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0.0"
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<dict>
|
||||
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
||||
<array>
|
||||
<string>com.uuvpn.apple.update_profiles</string>
|
||||
<string>com.uuvpn.appleaman.update_profiles</string>
|
||||
</array>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
@@ -19,7 +19,7 @@
|
||||
<string>Owner</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>com.uuvpn.apple.profile</string>
|
||||
<string>com.uuvpn.appleaman.profile</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
@@ -57,7 +57,7 @@
|
||||
</dict>
|
||||
<key>NSUbiquitousContainers</key>
|
||||
<dict>
|
||||
<key>iCloud.com.uuvpn.apple</key>
|
||||
<key>iCloud.com.uuvpn.appleaman</key>
|
||||
<dict>
|
||||
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
|
||||
<true/>
|
||||
@@ -85,7 +85,7 @@
|
||||
<key>UTTypeIconFiles</key>
|
||||
<array/>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>com.uuvpn.apple.profile</string>
|
||||
<string>com.uuvpn.appleaman.profile</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>public.filename-extension</key>
|
||||
@@ -111,7 +111,7 @@
|
||||
<string>AppIcon.icns</string>
|
||||
</array>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>com.uuvpn.apple.profile</string>
|
||||
<string>com.uuvpn.appleaman.profile</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>public.filename-extension</key>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<dict>
|
||||
<key>com.apple.developer.icloud-container-identifiers</key>
|
||||
<array>
|
||||
<string>iCloud.com.uuvpn.apple</string>
|
||||
<string>iCloud.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
<key>com.apple.developer.icloud-services</key>
|
||||
<array>
|
||||
@@ -16,11 +16,11 @@
|
||||
</array>
|
||||
<key>com.apple.developer.ubiquity-container-identifiers</key>
|
||||
<array>
|
||||
<string>iCloud.com.uuvpn.apple</string>
|
||||
<string>iCloud.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.com.uuvpn.apple</string>
|
||||
<string>group.com.uuvpn.appleaman</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 331 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 362 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 410 KiB |
@@ -436,7 +436,7 @@
|
||||
3AEC214B2A45AA8E00A63465 /* FilePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilePath.swift; sourceTree = "<group>"; };
|
||||
3AEC21742A45B0B800A63465 /* NavigationPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationPage.swift; sourceTree = "<group>"; };
|
||||
3AEC21782A45BA5300A63465 /* EnvironmentValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnvironmentValues.swift; sourceTree = "<group>"; };
|
||||
3AEECBF12A6DF40A006A0E0C /* com.uuvpn.apple.system.systemextension */ = {isa = PBXFileReference; explicitFileType = "wrapper.system-extension"; includeInIndex = 0; path = com.uuvpn.apple.system.systemextension; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3AEECBF12A6DF40A006A0E0C /* com.uuvpn.appleaman.system.systemextension */ = {isa = PBXFileReference; explicitFileType = "wrapper.system-extension"; includeInIndex = 0; path = com.uuvpn.appleaman.system.systemextension; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3AEECBF42A6DF40A006A0E0C /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = "<group>"; };
|
||||
3AEECBF62A6DF40A006A0E0C /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
|
||||
3AEECBF82A6DF40A006A0E0C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
@@ -717,7 +717,7 @@
|
||||
3A77016D2A4E6B34008F031F /* IntentsExtension.appex */,
|
||||
3A096F862A4ED3DE00D4A2ED /* Extension.appex */,
|
||||
3A4EAD102A4FEAE6005435B3 /* ApplicationLibrary.framework */,
|
||||
3AEECBF12A6DF40A006A0E0C /* com.uuvpn.apple.system.systemextension */,
|
||||
3AEECBF12A6DF40A006A0E0C /* com.uuvpn.appleaman.system.systemextension */,
|
||||
3AEECC2F2A6DFDAD006A0E0C /* MacLibrary.framework */,
|
||||
);
|
||||
name = Products;
|
||||
@@ -1104,7 +1104,7 @@
|
||||
);
|
||||
name = SystemExtension;
|
||||
productName = SystemExtension;
|
||||
productReference = 3AEECBF12A6DF40A006A0E0C /* com.uuvpn.apple.system.systemextension */;
|
||||
productReference = 3AEECBF12A6DF40A006A0E0C /* com.uuvpn.appleaman.system.systemextension */;
|
||||
productType = "com.apple.product-type.system-extension";
|
||||
};
|
||||
3AEECC2E2A6DFDAD006A0E0C /* MacLibrary */ = {
|
||||
@@ -1496,7 +1496,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = Extension/Info.plist;
|
||||
@@ -1512,7 +1512,7 @@
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
||||
MARKETING_VERSION = 1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.extension;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.extension;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
@@ -1536,7 +1536,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = Extension/Info.plist;
|
||||
@@ -1552,7 +1552,7 @@
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
||||
MARKETING_VERSION = 1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.extension;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.extension;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
@@ -1594,7 +1594,7 @@
|
||||
MARKETING_VERSION = 1.0;
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.application;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.application;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1637,7 +1637,7 @@
|
||||
MARKETING_VERSION = 1.0;
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.application;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.application;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1659,7 +1659,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = IntentsExtension/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = IntentsExtension;
|
||||
@@ -1675,7 +1675,7 @@
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
||||
MARKETING_VERSION = 1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.intents;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.intents;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
REEXPORTED_LIBRARY_PATHS = "";
|
||||
@@ -1698,7 +1698,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = IntentsExtension/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = IntentsExtension;
|
||||
@@ -1714,7 +1714,7 @@
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
||||
MARKETING_VERSION = 1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.intents;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.intents;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
REEXPORTED_LIBRARY_PATHS = "";
|
||||
@@ -1871,7 +1871,7 @@
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 51;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = XiaoXiong/Info.plist;
|
||||
@@ -1895,7 +1895,7 @@
|
||||
);
|
||||
MARKETING_VERSION = 1.1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "--deep";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman;
|
||||
PRODUCT_NAME = uuvpn;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1919,7 +1919,7 @@
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 51;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = XiaoXiong/Info.plist;
|
||||
@@ -1943,7 +1943,7 @@
|
||||
);
|
||||
MARKETING_VERSION = 1.1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "--deep";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman;
|
||||
PRODUCT_NAME = uuvpn;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1967,7 +1967,7 @@
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
@@ -1988,7 +1988,7 @@
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
|
||||
OTHER_CODE_SIGN_FLAGS = "--deep";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.library;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.library;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
@@ -2016,7 +2016,7 @@
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
@@ -2037,7 +2037,7 @@
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
|
||||
OTHER_CODE_SIGN_FLAGS = "--deep";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.library;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.library;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
@@ -2060,7 +2060,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -2075,7 +2075,7 @@
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
||||
MARKETING_VERSION = 1.9.6;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.system;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.system;
|
||||
PRODUCT_NAME = "$(inherited)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
@@ -2093,7 +2093,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = SQATMWM798;
|
||||
DEVELOPMENT_TEAM = BV8P95Z793;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -2108,7 +2108,7 @@
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.0;
|
||||
MARKETING_VERSION = 1.9.6;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.system;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.system;
|
||||
PRODUCT_NAME = "$(inherited)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
@@ -2147,7 +2147,7 @@
|
||||
MARKETING_VERSION = 1.0;
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.macapp;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.macapp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
@@ -2187,7 +2187,7 @@
|
||||
MARKETING_VERSION = 1.0;
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
|
||||
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.apple.macapp;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.uuvpn.appleaman.macapp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
|
||||
Reference in New Issue
Block a user