Swift中基于MessageKit的聊天页面布尔条件判断失效问题排查
问题排查结果
1. 核心逻辑问题:isnewConversation默认值错误
你在ChatDashboard类中直接将isnewConversation初始值设为false,且代码中没有任何在新建会话场景下将该值改为true的逻辑,所以判断条件永远不成立,不会进入对应分支。
2. 变量冗余+拼写错误
类中重复定义了接收方名称变量:
var receiverName:String? = nil // 拼写正确 var isnewConversation = false var recevierName:String? = nil // 拼写错误,r和v顺序颠倒
后续代码用的是拼写错误的recevierName,如果外部赋值的时候用的是正确拼写的变量,会导致后续guard let校验失败直接返回。
3. sendMessage方法逻辑错误
你调用的sendMessageReciverToSender方法直接监听了\(conversationId)/messages节点,返回的结果本身就是消息数组,不需要再从返回值中取["messages"]字段,原代码中if var conversationData = receiverToSenderNdoe["messages"] as? [[String:Any]]判断永远不成立,代码无法执行到保存逻辑。
4. 参数类型不匹配
reciverToSenderSave方法要求第二个参数传入完整的消息数组[[String:Any]],但原代码传入的是单条消息对象newMessge,类型不匹配会导致运行报错。
修复步骤
- 调整
isnewConversation赋值逻辑:跳转进入ChatDashboard时,如果是和新用户发起首次聊天,手动将该属性设为true,同时无需传入conversationId;如果是进入已有会话,传入对应conversationId的同时将该属性设为false。 - 删除冗余的拼写错误变量,统一使用正确拼写的
receiverName,全局替换所有用到错误拼写的地方。 - 修正
sendMessage方法的逻辑:
func sendMessage(_ convesationId:String,_ name:String,_ message:Message,completion:@escaping(Bool) -> Void){ self.sendMessageReciverToSender(convesationId) { (user) in // 直接用返回的消息数组 guard var conversationData = user else { completion(false) return } let dformatter = DateFormatter() dformatter.dateFormat = "dd/MM/yyy HH:mm" let dateToString = dformatter.string(from: Date()) guard let email = UserDefaults.standard.value(forKey: "useremail") as? String else { print("Email not found in user default") completion(false) return } let currentUserEmail = getUserEmail(currentEmail: email) var messageData = "" switch message.kind{ case .text(let messageText): messageData = messageText default: break } let newMessge: [String:Any] = [ "id":message.messageId, "type":message.kind.messageKindString, "content":messageData, "date": dateToString, "sender_email":currentUserEmail, "is_read":false, "name":name ] // 追加新消息到数组 conversationData.append(newMessge) // 传入完整数组执行保存 self.reciverToSenderSave(convesationId, conversationData) { (result) in completion(result) } } }
- 在
insertConversation2的成功回调中,记得给当前控制器的conversationId属性赋值,避免后续发送消息走else分支时校验失败。
内容的提问来源于stack exchange,提问作者Faheem
相关产品推荐
相关产品推荐

