Phase 1 Day 1: 基础架构搭建
- 创建 white-label-base 分支 - 添加 APIConfig.swift(API 域名动态生成,XOR + Base64 加密) * DEV 环境使用原测试域名 * RELEASE 环境使用新域名 https://api.epartylive.com - 添加 Swift/OC 混编支持(YuMi-Bridging-Header.h) - 创建 GlobalEventManager(全局事件管理器) * 迁移 NIMSDK 代理 * 迁移房间最小化逻辑 * 迁移全局通知处理 - 创建 NewTabBarController(Swift TabBar,只有 2 个 Tab) * Moment Tab * Mine Tab * 新的主色调和样式
This commit is contained in:
93
YuMi/Config/APIConfig.swift
Normal file
93
YuMi/Config/APIConfig.swift
Normal file
@@ -0,0 +1,93 @@
|
||||
//
|
||||
// APIConfig.swift
|
||||
// YuMi
|
||||
//
|
||||
// Created by AI on 2025-10-09.
|
||||
// Copyright © 2025 YuMi. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
/// API 域名配置类
|
||||
/// 使用 XOR + Base64 双重混淆防止反编译
|
||||
@objc class APIConfig: NSObject {
|
||||
|
||||
// MARK: - Private Properties
|
||||
|
||||
/// XOR 加密密钥
|
||||
private static let xorKey: UInt8 = 77
|
||||
|
||||
/// RELEASE 环境域名(加密后)
|
||||
/// 原始域名:https://api.epartylive.com
|
||||
private static let releaseEncodedParts: [String] = [
|
||||
"JTk5PT53YmI=", // https:// (XOR 后 Base64)
|
||||
"LD0kYw==", // api. (XOR 后 Base64)
|
||||
"KD0sPzk0ISQ7KGMuIiA=", // epartylive.com (XOR 后 Base64)
|
||||
]
|
||||
|
||||
// MARK: - Public Methods
|
||||
|
||||
/// 获取 API 基础域名
|
||||
/// - Returns: 根据编译环境返回对应的域名
|
||||
@objc static func baseURL() -> String {
|
||||
#if DEBUG
|
||||
// DEV 环境:使用原有的测试域名(不变)
|
||||
return HttpRequestHelper.getHostUrl()
|
||||
#else
|
||||
// RELEASE 环境:使用动态生成的新域名
|
||||
let url = decodeURL(from: releaseEncodedParts)
|
||||
|
||||
// 验证解密结果
|
||||
if url.isEmpty || !url.hasPrefix("http") {
|
||||
NSLog("[APIConfig] 警告:域名解密失败,使用备用域名")
|
||||
return backupURL()
|
||||
}
|
||||
|
||||
return url
|
||||
#endif
|
||||
}
|
||||
|
||||
/// 备用域名(降级方案)
|
||||
/// - Returns: 原域名(仅在解密失败时使用)
|
||||
@objc static func backupURL() -> String {
|
||||
return HttpRequestHelper.getHostUrl()
|
||||
}
|
||||
|
||||
// MARK: - Private Methods
|
||||
|
||||
/// 解密域名
|
||||
/// - Parameter parts: 加密后的域名片段数组
|
||||
/// - Returns: 解密后的完整域名
|
||||
private static func decodeURL(from parts: [String]) -> String {
|
||||
let decoded = parts.compactMap { part -> String? in
|
||||
guard let data = Data(base64Encoded: part) else {
|
||||
NSLog("[APIConfig] Base64 解码失败: \(part)")
|
||||
return nil
|
||||
}
|
||||
let xored = data.map { $0 ^ xorKey }
|
||||
return String(bytes: xored, encoding: .utf8)
|
||||
}
|
||||
|
||||
let result = decoded.joined()
|
||||
|
||||
#if DEBUG
|
||||
NSLog("[APIConfig] 解密后的域名: \(result)")
|
||||
#endif
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Debug Helper
|
||||
|
||||
#if DEBUG
|
||||
extension APIConfig {
|
||||
/// 测试方法:验证域名加密/解密是否正常
|
||||
@objc static func testEncryption() {
|
||||
print("=== APIConfig 加密测试 ===")
|
||||
print("Release 域名: \(decodeURL(from: releaseEncodedParts))")
|
||||
print("当前环境域名: \(baseURL())")
|
||||
print("备用域名: \(backupURL())")
|
||||
}
|
||||
}
|
||||
#endif
|
Reference in New Issue
Block a user