SwiftUI中RTIInputSystemClient会话ID无效错误求助
解决登录/创建账户触发的RTIInputSystemClient会话ID无效错误
控制台输出错误:
-[RTIInputSystemClient remoteTextInputSessionWithID:performInputOperation:] perform input operation requires a valid sessionID
问题根源排查
从你提供的AuthView代码来看,主要有几个可能触发该错误的点:
- 键盘隐藏方式不安全:使用
UIApplication.shared.sendAction强制调用resignFirstResponder,可能破坏SwiftUI输入系统的会话管理,导致后续输入会话异常。 - 冗余状态变量导致的状态不同步:
storedEmail/storedPassword属于多余变量,TextField已经直接绑定email/password状态,额外的onChange和onSubmit赋值操作会引发不必要的状态更新,干扰输入系统的正常流程。 - 未利用SwiftUI原生焦点管理:声明了
@FocusState变量但未绑定到输入框,放弃了SwiftUI对输入焦点的安全管理机制。
修改后的代码方案
import SwiftUI import Combine struct IdentifiableError: Identifiable { let id = UUID() let message: String } struct AuthView: View { @ObservedObject var viewModel: JobApplicationViewModel @State private var email: String = "" @State private var password: String = "" @State private var identifiableError: IdentifiableError? @FocusState private var focusedField: Field? // 明确绑定输入框焦点 // 定义焦点枚举,区分不同输入框 enum Field { case email, password } var body: some View { VStack { Image(systemName: "briefcase.fill") .resizable() .scaledToFit() .frame(width: 120, height: 120) .padding() Text("Welcome to Job Tracker Pro") .font(.largeTitle) TextField("Email", text: $email) .autocapitalization(.none) .keyboardType(.emailAddress) .disableAutocorrection(true) .padding() .border(Color.gray) .focused($focusedField, equals: .email) // 绑定焦点 SecureField("Password", text: $password) .padding() .border(Color.gray) .focused($focusedField, equals: .password) // 绑定焦点 Button("Log In") { focusedField = nil // 通过FocusState安全隐藏键盘 viewModel.logIn(email: email, password: password) { success, message in // 处理登录结果 } } .padding() Button("Create Account") { focusedField = nil // 通过FocusState安全隐藏键盘 viewModel.createAccount(email: email, password: password) { success, message in // 处理账户创建结果 } } .padding() } .alert(item: $identifiableError) { error in Alert( title: Text("Error"), message: Text(error.message), dismissButton: .default(Text("OK")) { identifiableError = nil } ) } .onReceive(viewModel.$error) { error in if let error = error { identifiableError = IdentifiableError(message: error.localizedDescription) } } } }
额外排查建议
- 检查
JobApplicationViewModel中的logIn/createAccount方法:确保所有UI相关的回调操作都在主线程执行(可通过DispatchQueue.main.async包裹),后台线程操作UI可能引发输入系统异常。 - 测试环境验证:尝试在真机上运行,部分模拟器的输入系统模拟可能存在bug;同时检查是否为特定iOS版本问题(比如iOS 15/16的输入系统已知小问题)。
- 清理缓存:清理Xcode的DerivedData,重启Xcode和模拟器,排除编译缓存导致的异常。
内容的提问来源于stack exchange,提问作者Jake Steirer
相关产品推荐
相关产品推荐

