From 84fbb850bedf0fab022f6202d4f87121094cb75d Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 14 Aug 2025 15:16:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E6=97=B6=E5=B1=8F=E8=94=BDqq=E9=9F=B3?= =?UTF-8?q?=E4=B9=90=E7=83=AD=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/qq_music/QPlayAutoManager.swift | 128 +++++++++++++++++- .../Sources/qq_music/QqMusicPlugin.swift | 66 +++++---- 2 files changed, 158 insertions(+), 36 deletions(-) diff --git a/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QPlayAutoManager.swift b/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QPlayAutoManager.swift index 886cef1e8..57aa637a8 100644 --- a/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QPlayAutoManager.swift +++ b/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QPlayAutoManager.swift @@ -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: 无待处理的登录请求") } } diff --git a/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QqMusicPlugin.swift b/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QqMusicPlugin.swift index fdc88c1fe..339b36dfc 100644 --- a/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QqMusicPlugin.swift +++ b/local_plugins/qq_music/ios/qq_music/Sources/qq_music/QqMusicPlugin.swift @@ -140,38 +140,44 @@ public class QqMusicPlugin: NSObject, FlutterPlugin { result(["success": true]) } - // 新增:登录功能 + // 新增:自动登陆 private func handleLogin(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - // 如果已经登录,直接返回登录信息 - if QPlayAutoManager.shared.isLoginOK { - let openId = QPlayAutoManager.shared.openId ?? "" - let openToken = QPlayAutoManager.shared.openToken ?? "" - result([ - "success": true, - "openId": openId, - "openToken": openToken, - "expireTime": "" - ]) - return - } + //iOS 暂时不支持自动登陆 + result([ + "success": false, + ]) + return - // 如果未登录,主动执行登录 - QPlayAutoManager.shared.login { success in - DispatchQueue.main.async { - if success { - let openId = QPlayAutoManager.shared.openId ?? "" - let openToken = QPlayAutoManager.shared.openToken ?? "" - result([ - "success": true, - "openId": openId, - "openToken": openToken, - "expireTime": "" - ]) - } else { - result(FlutterError(code: "LOGIN_FAILED", message: "登录失败", details: nil)) - } - } - } + +// if QPlayAutoManager.shared.isLoginOK { +// let openId = QPlayAutoManager.shared.openId ?? "" +// let openToken = QPlayAutoManager.shared.openToken ?? "" +// result([ +// "success": true, +// "openId": openId, +// "openToken": openToken, +// "expireTime": "" +// ]) +// return +// } +// +// // 如果未登录,主动执行登录 +// QPlayAutoManager.shared.login { success in +// DispatchQueue.main.async { +// if success { +// let openId = QPlayAutoManager.shared.openId ?? "" +// let openToken = QPlayAutoManager.shared.openToken ?? "" +// result([ +// "success": true, +// "openId": openId, +// "openToken": openToken, +// "expireTime": "" +// ]) +// } else { +// result(FlutterError(code: "LOGIN_FAILED", message: "登录失败", details: nil)) +// } +// } +// } } // 新增:搜索歌曲功能