You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:09:02