
- 创建 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 * 新的主色调和样式
94 lines
2.7 KiB
Swift
94 lines
2.7 KiB
Swift
//
|
||
// 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
|