Swift开发ChatGPT聊天应用无响应问题排查求助
Swift ChatGPT App 无响应问题排查与解决思路
问题背景
按照iOS Academy的ChatGPT教程开发Swift聊天应用,已完成引入OpenAI封装包、生成API密钥、集成真实密钥代码等操作,但聊天功能无法生成响应,代码无报错也无返回结果,等待许久问题仍存在。
排查与解决步骤
1. 验证API密钥有效性
- 确认密钥未过期、未被禁用,且拥有
completions接口调用权限 - 直接通过curl验证密钥(替换
YOUR_API_KEY为真实密钥):
若请求失败,根据返回的错误信息调整密钥权限或更换密钥。curl https://api.openai.com/v1/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "gpt-3.5-turbo-instruct", "prompt": "Hello", "max_tokens": 50 }'
2. 确保网络权限配置正确
在Info.plist中确认已添加网络权限配置,保证应用能发起HTTPS请求:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>api.openai.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <false/> </dict> </dict> </dict>
3. 修复代码逻辑问题
问题点1:setup()方法可能未执行
当前onAppear绑定在HStack上,若视图布局异常会导致viewModel.setup()未调用,client始终为nil,send方法无任何执行动作。
修复:将onAppear移至外层VStack:
var body: some View { VStack(alignment: .leading){ ForEach(models, id: \.self) { string in Text(string) } Spacer() HStack{ TextField("type here", text: $text) Button("send"){ send() } } } .padding() .onAppear { viewModel.setup() } }
问题点2:缺少client初始化判断
添加nil检查,避免静默失败:
func send(text: String, completion: @escaping (String) -> Void) { guard let client = client else { print("Error: OpenAI client未初始化") completion("") return } // 后续调用逻辑 }
问题点3:模型兼容性
原默认模型text-davinci-003已逐步退役,更换为当前可用的gpt-3.5-turbo-instruct模型:
client.sendCompletion(with: text, model: .gpt35TurboInstruct, maxTokens: 500, completionHandler: { result in // 原有结果处理逻辑 })
问题点4:完善错误日志
增强错误输出,便于定位问题:
case.failure(let error): print("OpenAI API错误: \(error.localizedDescription)") print("错误详情: \(error)")
4. 检查OpenAI服务状态
确认OpenAI的completions服务无宕机或限流情况,可通过官方状态页面查看服务可用性。
修复后完整代码示例
import SwiftUI import OpenAISwift final class ViewModel: ObservableObject{ init() {} private var client: OpenAISwift? func setup(){ client = OpenAISwift(authToken: "MY-REAL-API-KEY") } func send(text: String, completion: @escaping (String) -> Void) { guard let client = client else { print("Error: OpenAI client未初始化") completion("") return } client.sendCompletion(with: text, model: .gpt35TurboInstruct, maxTokens: 500, completionHandler: { result in switch result { case.success(let model): let output = model.choices?.first?.text ?? "" completion(output) case.failure(let error): print("OpenAI API错误: \(error.localizedDescription)") print("错误详情: \(error)") } }) } } struct ContentView: View { @ObservedObject var viewModel = ViewModel() @State var text = "" @State var models = [String]() var body: some View { VStack(alignment: .leading){ ForEach(models, id: \.self) { string in Text(string) } Spacer() HStack{ TextField("type here", text: $text) Button("send"){ send() } } } .padding() .onAppear { viewModel.setup() } } func send() { guard !text.trimmingCharacters(in: .whitespaces).isEmpty else { return } models.append("Me: \(text)") viewModel.send(text: text) { response in DispatchQueue.main.async { self.models.append("GPT: " + response) print(text) print(response) self.text = "" } } } }
内容的提问来源于stack exchange,提问作者kitchen800
相关产品推荐
相关产品推荐

