|
|
|
@ -220,36 +220,87 @@ import QPlayAutoSDK |
|
|
|
|
|
|
|
// MARK: - Connection Management |
|
|
|
@objc public func connect(forceLogin: Bool = false) { |
|
|
|
print("QPlayAutoManager: 🔗 开始连接,forceLogin: \(forceLogin)") |
|
|
|
|
|
|
|
guard isAppRegistered else { |
|
|
|
print("QPlayAutoManager: App not registered, registering first") |
|
|
|
print("QPlayAutoManager: ❌ App未注册,先执行注册") |
|
|
|
registerAppWithDefaultConfig() |
|
|
|
return // 添加这个return语句 |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
print("QPlayAutoManager: App已注册,开始连接重试机制") |
|
|
|
// Add retry mechanism for socket errors |
|
|
|
connectWithRetry(forceLogin: forceLogin, retryCount: 3) |
|
|
|
} |
|
|
|
|
|
|
|
private func connectWithRetry(forceLogin: Bool, retryCount: Int) { |
|
|
|
print("QPlayAutoManager: 连接重试,剩余次数: \(retryCount), forceLogin: \(forceLogin)") |
|
|
|
|
|
|
|
guard retryCount > 0 else { |
|
|
|
print("QPlayAutoManager: Connection failed after all retries") |
|
|
|
print("QPlayAutoManager: ❌ 连接失败,所有重试次数已用完") |
|
|
|
print("QPlayAutoManager: 最终状态 - isConnected: \(isConnected), isLoginOK: \(isLoginOK)") |
|
|
|
notifyLoginCompletion(false) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
let startTime = Date() |
|
|
|
print("QPlayAutoManager: 调用 QPlayAutoSDK.connectAndForceLogin(\(forceLogin))") |
|
|
|
QPlayAutoSDK.connectAndForceLogin(forceLogin) |
|
|
|
|
|
|
|
// If connection fails due to socket error, retry after cleanup |
|
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { |
|
|
|
let endTime = Date() |
|
|
|
let duration = endTime.timeIntervalSince(startTime) |
|
|
|
|
|
|
|
print("QPlayAutoManager: 连接尝试完成,耗时: \(String(format: "%.2f", duration))秒") |
|
|
|
print("QPlayAutoManager: 连接状态检查 - isConnected: \(self.isConnected)") |
|
|
|
|
|
|
|
if !self.isConnected { |
|
|
|
print("QPlayAutoManager: Connection failed, retrying... (\(retryCount - 1) attempts left)") |
|
|
|
print("QPlayAutoManager: ⚠️ 连接失败,准备重试 (剩余 \(retryCount - 1) 次)") |
|
|
|
print("QPlayAutoManager: 执行清理操作") |
|
|
|
QPlayAutoSDK.stop() |
|
|
|
self.connectWithRetry(forceLogin: forceLogin, retryCount: retryCount - 1) |
|
|
|
} else { |
|
|
|
print("QPlayAutoManager: ✅ 连接成功") |
|
|
|
if forceLogin { |
|
|
|
print("QPlayAutoManager: 强制登录模式,等待用户授权...") |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@objc public func reconnect(timeout: TimeInterval, completion: @escaping (Bool, [String: Any]?) -> Void) { |
|
|
|
print("QPlayAutoManager: 开始执行reconnect,超时时间: \(timeout)秒") |
|
|
|
print("QPlayAutoManager: 执行前状态检查:") |
|
|
|
print(" - isConnected: \(QPlayAutoSDK.isConnected())") |
|
|
|
print(" - isConnecting: \(QPlayAutoSDK.isConnecting())") |
|
|
|
print(" - isLoginOK: \(QPlayAutoSDK.isLoginOK())") |
|
|
|
print(" - isQQMusicInstalled: \(QPlayAutoSDK.isQQMusicInstalled())") |
|
|
|
|
|
|
|
let startTime = Date() |
|
|
|
QPlayAutoSDK.reconnect(withTimeout: timeout) { (success, dict) in |
|
|
|
let endTime = Date() |
|
|
|
let duration = endTime.timeIntervalSince(startTime) |
|
|
|
|
|
|
|
print("QPlayAutoManager: reconnect完成,耗时: \(String(format: "%.2f", duration))秒") |
|
|
|
print("QPlayAutoManager: reconnect结果: \(success ? "成功" : "失败")") |
|
|
|
print("QPlayAutoManager: 返回数据: \(dict ?? [:])") |
|
|
|
print("QPlayAutoManager: 执行后状态检查:") |
|
|
|
print(" - isConnected: \(QPlayAutoSDK.isConnected())") |
|
|
|
print(" - isConnecting: \(QPlayAutoSDK.isConnecting())") |
|
|
|
print(" - isLoginOK: \(QPlayAutoSDK.isLoginOK())") |
|
|
|
|
|
|
|
if !success { |
|
|
|
// 分析可能的失败原因 |
|
|
|
if !QPlayAutoSDK.isQQMusicInstalled() { |
|
|
|
print("QPlayAutoManager: ❌ 失败原因:QQ音乐未安装") |
|
|
|
} else if !QPlayAutoSDK.isConnected() { |
|
|
|
print("QPlayAutoManager: ❌ 失败原因:网络连接失败或服务不可用") |
|
|
|
} else { |
|
|
|
print("QPlayAutoManager: ❌ 失败原因:token验证失败或其他SDK内部错误") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
completion(success, dict as? [String: Any]) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -302,10 +353,55 @@ import QPlayAutoSDK |
|
|
|
|
|
|
|
// 如果已经有登录请求在处理,直接返回 |
|
|
|
if loginCompletionHandlers.count > 1 { |
|
|
|
print("QPlayAutoManager: 登录请求已在队列中,当前队列长度: \(loginCompletionHandlers.count)") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// 强制登录 |
|
|
|
// 首先尝试使用保存的token进行reconnect。 暂时reconnect接口无法使用先屏蔽自动登陆逻辑 |
|
|
|
// if hasValidStoredToken() { |
|
|
|
// let tokenInfo = getStoredTokenInfo() |
|
|
|
// print("QPlayAutoManager: 检测到有效token,开始热启动连接") |
|
|
|
// print("QPlayAutoManager: Token信息 - OpenID: \(tokenInfo?["openId"] as? String ?? "未知")") |
|
|
|
// print("QPlayAutoManager: Token信息 - 登录时间: \(tokenInfo?["loginTime"] as? Date ?? Date())") |
|
|
|
// print("QPlayAutoManager: 当前连接状态 - isConnected: \(isConnected), isConnecting: \(isConnecting)") |
|
|
|
// print("QPlayAutoManager: 当前登录状态 - isLoginOK: \(isLoginOK)") |
|
|
|
// |
|
|
|
// reconnect(timeout: 10.0) { [weak self] success, responseDict in |
|
|
|
// if success { |
|
|
|
// print("QPlayAutoManager: ✅ 热启动连接成功") |
|
|
|
// print("QPlayAutoManager: 连接响应数据: \(responseDict ?? [:])") |
|
|
|
// self?.notifyLoginCompletion(true) |
|
|
|
// } else { |
|
|
|
// print("QPlayAutoManager: ❌ 热启动连接失败") |
|
|
|
// print("QPlayAutoManager: 失败响应数据: \(responseDict ?? [:])") |
|
|
|
// print("QPlayAutoManager: 连接状态检查 - isConnected: \(self?.isConnected ?? false)") |
|
|
|
// print("QPlayAutoManager: QQ音乐安装状态: \(self?.isQQMusicInstalled ?? false)") |
|
|
|
// print("QPlayAutoManager: 开始执行强制登录流程") |
|
|
|
// self?.forceLogin() |
|
|
|
// } |
|
|
|
// } |
|
|
|
// } else { |
|
|
|
print("QPlayAutoManager: ❌ 没有有效token,直接进行强制登录") |
|
|
|
let tokenInfo = getStoredTokenInfo() |
|
|
|
if tokenInfo == nil { |
|
|
|
print("QPlayAutoManager: 原因:本地未存储任何token信息") |
|
|
|
} else { |
|
|
|
print("QPlayAutoManager: 原因:token已过期或无效") |
|
|
|
print("QPlayAutoManager: 存储的token信息: \(tokenInfo!)") |
|
|
|
} |
|
|
|
forceLogin() |
|
|
|
// } |
|
|
|
} |
|
|
|
|
|
|
|
private func forceLogin() { |
|
|
|
print("QPlayAutoManager: 🔄 开始强制登录流程") |
|
|
|
print("QPlayAutoManager: 执行前环境检查:") |
|
|
|
print(" - QQ音乐安装状态: \(isQQMusicInstalled)") |
|
|
|
print(" - App注册状态: \(isAppRegistered)") |
|
|
|
print(" - 当前连接状态: \(isConnected)") |
|
|
|
print(" - 当前登录状态: \(isLoginOK)") |
|
|
|
|
|
|
|
// 强制登录,会跳转到QQ音乐 |
|
|
|
connect(forceLogin: true) |
|
|
|
|
|
|
|
// 设置超时检查 |
|
|
|
@ -314,10 +410,30 @@ import QPlayAutoSDK |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private func hasValidStoredToken() -> Bool { |
|
|
|
guard let storedOpenId = UserDefaults.standard.string(forKey: Self.STORED_OPEN_ID_KEY), |
|
|
|
let storedOpenToken = UserDefaults.standard.string(forKey: Self.STORED_OPEN_TOKEN_KEY), |
|
|
|
let loginTime = UserDefaults.standard.object(forKey: Self.STORED_LOGIN_TIME_KEY) as? Date else { |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
// 检查token是否过期 |
|
|
|
let currentTime = Date() |
|
|
|
return currentTime.timeIntervalSince(loginTime) <= Self.TOKEN_EXPIRE_TIME |
|
|
|
} |
|
|
|
|
|
|
|
private func checkLoginTimeout() { |
|
|
|
print("QPlayAutoManager: ⏰ 检查登录超时") |
|
|
|
print("QPlayAutoManager: 当前状态 - 队列长度: \(loginCompletionHandlers.count), isLoginOK: \(isLoginOK)") |
|
|
|
|
|
|
|
if !loginCompletionHandlers.isEmpty && !isLoginOK { |
|
|
|
print("QPlayAutoManager: 登录超时") |
|
|
|
print("QPlayAutoManager: ❌ 登录超时,清理回调队列") |
|
|
|
print("QPlayAutoManager: 超时时状态 - isConnected: \(isConnected), isQQMusicInstalled: \(isQQMusicInstalled)") |
|
|
|
notifyLoginCompletion(false) |
|
|
|
} else if isLoginOK { |
|
|
|
print("QPlayAutoManager: ✅ 登录已完成,无需超时处理") |
|
|
|
} else { |
|
|
|
print("QPlayAutoManager: 无待处理的登录请求") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|