feat: 更新项目配置和功能模块
- 修改Package.swift以支持iOS 15和macOS 12。 - 更新swift-tca-architecture-guidelines.mdc中的alwaysApply设置为false。 - 注释掉AppDelegate中的NIMSDK导入,移除不再使用的NIMConfigurationManager和NIMSessionManager文件。 - 添加新的API相关文件,包括EMailLoginFeature、IDLoginFeature和相关视图,增强登录功能。 - 更新APIConstants和APIEndpoints以反映新的API路径。 - 添加本地化支持文件,包含英文和中文简体的本地化字符串。 - 新增字体管理和安全工具类,支持AES和DES加密。 - 更新Xcode项目配置,调整版本号和启动画面设置。
This commit is contained in:
@@ -118,7 +118,7 @@ struct BaseRequest: Codable {
|
||||
self.appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0.0"
|
||||
|
||||
// 应用名称
|
||||
self.app = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "yana"
|
||||
self.app = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "eparty"
|
||||
|
||||
// 网络类型检测(WiFi=2, 蜂窝网络=1)
|
||||
self.netType = NetworkTypeDetector.getCurrentNetworkType()
|
||||
@@ -131,7 +131,7 @@ struct BaseRequest: Codable {
|
||||
|
||||
// 渠道信息
|
||||
#if DEBUG
|
||||
self.channel = "TestFlight"
|
||||
self.channel = "molistar_enterprise"
|
||||
#else
|
||||
self.channel = "appstore"
|
||||
#endif
|
||||
@@ -186,9 +186,10 @@ struct BaseRequest: Codable {
|
||||
}
|
||||
|
||||
// 3. 按 key 升序排序并拼接
|
||||
// 拼接格式 "key0=value0&key1=value1&key2=value2"
|
||||
let sortedKeys = filteredParams.keys.sorted()
|
||||
let paramString = sortedKeys.map { key in
|
||||
"\(key)=\(filteredParams[key] ?? "")"
|
||||
"\(key)=\(String(describing: filteredParams[key] ?? ""))"
|
||||
}.joined(separator: "&")
|
||||
|
||||
// 4. 添加密钥
|
||||
@@ -205,7 +206,7 @@ struct NetworkTypeDetector {
|
||||
static func getCurrentNetworkType() -> Int {
|
||||
// WiFi = 2, 蜂窝网络 = 1
|
||||
// 这里是简化实现,实际应该检测网络状态
|
||||
return 1 // 默认蜂窝网络
|
||||
return 2 // 默认蜂窝网络
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,16 +225,136 @@ struct CarrierInfoManager {
|
||||
|
||||
// MARK: - User Info Manager (for Headers)
|
||||
struct UserInfoManager {
|
||||
static func getCurrentUserId() -> String? {
|
||||
// 从存储中获取当前用户 ID
|
||||
// 实际实现应该从 AccountInfoStorage 或类似的地方获取
|
||||
return nil
|
||||
private static let userDefaults = UserDefaults.standard
|
||||
|
||||
// MARK: - Storage Keys
|
||||
private enum StorageKeys {
|
||||
static let userId = "user_id"
|
||||
static let accessToken = "access_token"
|
||||
static let ticket = "user_ticket"
|
||||
static let userInfo = "user_info"
|
||||
}
|
||||
|
||||
// MARK: - User ID Management
|
||||
static func getCurrentUserId() -> String? {
|
||||
return userDefaults.string(forKey: StorageKeys.userId)
|
||||
}
|
||||
|
||||
static func saveUserId(_ userId: String) {
|
||||
userDefaults.set(userId, forKey: StorageKeys.userId)
|
||||
userDefaults.synchronize()
|
||||
print("💾 保存用户ID: \(userId)")
|
||||
}
|
||||
|
||||
// MARK: - Access Token Management
|
||||
static func getAccessToken() -> String? {
|
||||
return userDefaults.string(forKey: StorageKeys.accessToken)
|
||||
}
|
||||
|
||||
static func saveAccessToken(_ accessToken: String) {
|
||||
userDefaults.set(accessToken, forKey: StorageKeys.accessToken)
|
||||
userDefaults.synchronize()
|
||||
print("💾 保存 Access Token")
|
||||
}
|
||||
|
||||
// MARK: - Ticket Management (内存存储)
|
||||
private static var currentTicket: String?
|
||||
|
||||
static func getCurrentUserTicket() -> String? {
|
||||
// 从存储中获取当前用户认证票据
|
||||
// 实际实现应该从 AccountInfoStorage 或类似的地方获取
|
||||
return nil
|
||||
return currentTicket
|
||||
}
|
||||
|
||||
static func saveTicket(_ ticket: String) {
|
||||
currentTicket = ticket
|
||||
print("💾 保存 Ticket 到内存")
|
||||
}
|
||||
|
||||
static func clearTicket() {
|
||||
currentTicket = nil
|
||||
print("🗑️ 清除 Ticket")
|
||||
}
|
||||
|
||||
// MARK: - User Info Management
|
||||
static func saveUserInfo(_ userInfo: UserInfo) {
|
||||
do {
|
||||
let data = try JSONEncoder().encode(userInfo)
|
||||
userDefaults.set(data, forKey: StorageKeys.userInfo)
|
||||
userDefaults.synchronize()
|
||||
|
||||
// 同时保存用户ID
|
||||
if let userId = userInfo.userId {
|
||||
saveUserId(userId)
|
||||
}
|
||||
|
||||
print("💾 保存用户信息成功")
|
||||
} catch {
|
||||
print("❌ 保存用户信息失败: \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
static func getUserInfo() -> UserInfo? {
|
||||
guard let data = userDefaults.data(forKey: StorageKeys.userInfo) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
do {
|
||||
return try JSONDecoder().decode(UserInfo.self, from: data)
|
||||
} catch {
|
||||
print("❌ 解析用户信息失败: \(error)")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Complete Authentication Data Management
|
||||
/// 保存完整的认证信息(OAuth Token + Ticket + 用户信息)
|
||||
static func saveCompleteAuthenticationData(
|
||||
accessToken: String,
|
||||
ticket: String,
|
||||
uid: Int?, // 修改:从String?改为Int?
|
||||
userInfo: UserInfo?
|
||||
) {
|
||||
saveAccessToken(accessToken)
|
||||
saveTicket(ticket)
|
||||
|
||||
if let uid = uid {
|
||||
saveUserId("\(uid)") // 转换为字符串保存
|
||||
}
|
||||
|
||||
if let userInfo = userInfo {
|
||||
saveUserInfo(userInfo)
|
||||
}
|
||||
|
||||
print("✅ 完整认证信息保存成功")
|
||||
}
|
||||
|
||||
/// 检查是否有有效的认证信息
|
||||
static func hasValidAuthentication() -> Bool {
|
||||
return getAccessToken() != nil && getCurrentUserTicket() != nil
|
||||
}
|
||||
|
||||
/// 清除所有认证信息
|
||||
static func clearAllAuthenticationData() {
|
||||
userDefaults.removeObject(forKey: StorageKeys.userId)
|
||||
userDefaults.removeObject(forKey: StorageKeys.accessToken)
|
||||
userDefaults.removeObject(forKey: StorageKeys.userInfo)
|
||||
clearTicket()
|
||||
userDefaults.synchronize()
|
||||
|
||||
print("🗑️ 清除所有认证信息")
|
||||
}
|
||||
|
||||
/// 尝试恢复 Ticket(用于应用重启后)
|
||||
static func restoreTicketIfNeeded() async -> Bool {
|
||||
guard let accessToken = getAccessToken(),
|
||||
getCurrentUserTicket() == nil else {
|
||||
return false
|
||||
}
|
||||
|
||||
print("🔄 尝试使用 Access Token 恢复 Ticket...")
|
||||
|
||||
// 这里需要注入 APIService 依赖,暂时返回 false
|
||||
// 实际实现中应该调用 TicketHelper.createTicketRequest
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,6 +388,7 @@ protocol APIRequestProtocol {
|
||||
var queryParameters: [String: String]? { get }
|
||||
var bodyParameters: [String: Any]? { get }
|
||||
var headers: [String: String]? { get }
|
||||
var customHeaders: [String: String]? { get } // 新增:自定义请求头
|
||||
var timeout: TimeInterval { get }
|
||||
var includeBaseParameters: Bool { get }
|
||||
}
|
||||
@@ -275,6 +397,7 @@ extension APIRequestProtocol {
|
||||
var timeout: TimeInterval { 30.0 }
|
||||
var includeBaseParameters: Bool { true }
|
||||
var headers: [String: String]? { nil }
|
||||
var customHeaders: [String: String]? { nil } // 新增:默认实现
|
||||
}
|
||||
|
||||
// MARK: - Generic API Response
|
||||
@@ -285,19 +408,5 @@ struct APIResponse<T: Codable>: Codable {
|
||||
let code: Int?
|
||||
}
|
||||
|
||||
// MARK: - String MD5 Extension
|
||||
extension String {
|
||||
func md5() -> String {
|
||||
let data = Data(self.utf8)
|
||||
let hash = data.withUnsafeBytes { bytes -> [UInt8] in
|
||||
var hash = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
|
||||
CC_MD5(bytes.baseAddress, CC_LONG(data.count), &hash)
|
||||
return hash
|
||||
}
|
||||
return hash.map { String(format: "%02x", $0) }.joined()
|
||||
}
|
||||
}
|
||||
|
||||
// 需要导入 CommonCrypto
|
||||
import CommonCrypto
|
||||
// 注意:String+MD5 扩展已移至 Utils/Extensions/String+MD5.swift
|
||||
|
||||
|
Reference in New Issue
Block a user