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

MongoDB Realm通知token仅触发活跃设备,其余已打开Realm的设备无响应如何解决?

问题排查和解决方法

1. 检查Realm实例的自动刷新是否开启

Realm实例默认在主线程会开启自动刷新,如果你的列表页面所在的线程是主线程,确认没有手动关闭自动刷新:

// 确认这个值为true,手动设置为false会导致不会自动拉取同步变更触发通知
print(publicRealm?.autorefresh ?? false)

如果被关闭,手动打开即可:

publicRealm?.autorefresh = true

2. 完善通知观察的错误处理

你当前的观察回调忽略了错误信息,建议补全回调的分支处理,确认观察过程中没有报错:

self?.notificationToken = self?.locations!.observe { [weak self] changes in
    guard let self = self else { return }
    switch changes {
    case .initial:
        self.tableView.reloadData()
    case .update:
        self.tableView.reloadData()
        print("收到变更通知")
    case .error(let error):
        print("观察Location列表出错:\(error.localizedDescription)")
    }
}

3. 确认没有调用Realm实例的invalidate方法

如果你的代码中任何位置对publicRealm调用了invalidate()方法,会导致该Realm实例停止自动更新,只有手动调用refresh()才会拉取最新数据,删除所有invalidate()调用即可解决。

4. 检查模型字段的修饰符是否正确

你提到升级了Realm版本,新版本的Swift Realm要求所有需要持久化、同步的字段必须用@Persisted修饰,如果你的Location模型的status、statusMessage字段还是用老的@objc dynamic修饰,可能会出现同步变更识别异常的问题,修正模型字段修饰符即可。

5. 确认PUBLIC分区的Realm实例身份统一

你初始是用匿名用户打开的PUBLIC分区,用户登录之后如果没有重新用登录后的用户身份打开PUBLIC分区,虽然开发模式下可以写入,但可能出现同步事件接收异常,建议用户登录成功之后,重新用登录用户的配置打开PUBLIC分区,替换原来的publicRealm实例,再重新创建观察通知。

6. 服务端自定义函数修改不触发通知的问题

如果你的自定义函数是直接操作MongoDB集合(而非通过Realm SDK写入分区数据),默认情况下变更会同步到客户端,但如果你的同步配置关闭了Atlas变更流监听,就会出现客户端收不到变更的问题。
临时验证方式:改为通过Realm SDK在客户端写入数据,确认其他设备可以收到通知,说明问题出在服务端修改的触发逻辑上,开启同步服务的Atlas变更流监听即可解决。

7. 确认同步连接状态正常

在列表页面添加同步状态监听,确认其他设备的PUBLIC分区同步连接是活跃状态,没有断连:

guard let syncSession = publicRealm?.syncSession else { return }
// 监听下载进度
syncSession.addProgressNotification(for: .download, mode: .reportIndefinitely) { progress in
    print("下载进度:\(progress.fractionTransferred)")
}
// 监听连接状态
syncSession.connectionStateChangeListener = { _, newState in
    print("同步连接状态:\(newState)")
}

如果连接状态异常,检查网络、App Service的同步配置是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:06:05