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

Swift调用Kotlin挂起函数报错,如何调整删FCM Token再登出流程?

解决Kotlin挂起函数从Swift调用时的主线程限制问题

问题原因

崩溃的核心原因是:从Swift/Objective-C调用Kotlin挂起函数必须在主线程执行。你的代码中,deleteToken的回调可能在后台线程触发,此时在回调里直接调用doLogout(挂起函数)就会触发这个异常。

解决方案

方案1:Swift回调中切换回主线程调用登出函数

修改Swift的doLogout方法,确保调用doLogout时处于主线程:

func doLogout(){
    repo.deleteToken(token: myFCMToken){ error in
        // 切回主线程执行后续操作
        DispatchQueue.main.async { [weak self] in
            guard let self = self else { return }
            self.isLoginShown = true
            // 现在在主线程调用挂起函数,符合要求
            self.repo.doLogout(){ _ in
                // 可添加登出完成后的处理逻辑
            }
        }
    }
}

方案2:Kotlin层合并两个挂起操作

在Kotlin端新增一个组合函数,将删除Token和登出逻辑合并,减少Swift端的跨线程调用:

suspend fun deleteTokenAndLogout(token: String) {
    deleteToken(token)
    doLogout()
}

然后Swift端只需调用这个合并后的函数:

func doLogout(){
    repo.deleteTokenAndLogout(token: myFCMToken){ error in
        DispatchQueue.main.async { [weak self] in
            self?.isLoginShown = true
        }
    }
}

补充说明

  • 方案1适合不想修改Kotlin代码的场景,通过Swift的线程调度解决问题;
  • 方案2更简洁,将业务逻辑收拢在Kotlin层,避免Swift端的线程管理失误,也让流程更连贯。

内容的提问来源于stack exchange,提问作者dhaval123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:05:16