如何在其他已登录设备上检测Realm应用用户已被删除?
检测Realm应用用户在其他设备上是否被删除的解决方案
Realm的isLoggedIn方法仅反映本地缓存的用户状态,不会主动同步服务器端的用户删除状态,所以会出现你遇到的问题。以下是几种可行的检测方案:
主动刷新用户数据验证状态
调用refreshCustomData()方法向服务器请求最新的用户信息,该操作会触发服务器端的身份校验。如果用户已被删除,服务器会返回认证错误,此时即可捕获异常并处理登出逻辑:do { try await RealmApp.shared.currentUser?.refreshCustomData() // 刷新成功,用户账号仍有效 } catch { // 刷新失败,判定用户已被删除,执行登出 RealmApp.shared.currentUser?.logOut() // 这里可以添加UI提示或状态重置逻辑 }在数据操作中捕获认证错误
用户被删除后,后续的同步操作(如数据上传)最终会触发服务器的认证拦截。在数据操作的错误处理中监听认证相关的错误码(如invalidSession、authenticationFailed),一旦触发就验证用户状态:do { try realm.write { // 执行数据写入/上传操作 } } catch let error as Realm.Error { switch error.code { case .invalidSession, .authenticationFailed: // 会话失效或认证失败,尝试刷新用户状态 do { try await RealmApp.shared.currentUser?.refreshCustomData() } catch { RealmApp.shared.currentUser?.logOut() } default: // 处理其他错误 break } }定时轮询验证用户状态
如果需要相对实时的状态同步,可以设置一个低频率的定时器(比如每5-10分钟一次),定期调用refreshCustomData()检查用户状态。注意不要设置过短的间隔,避免增加服务器负载和消耗设备资源。监听同步会话的错误通知
为Realm同步会话添加错误监听,当出现会话无效类的错误时,直接判定用户身份失效并执行登出:guard let user = RealmApp.shared.currentUser else { return } let config = user.configuration(partitionValue: "你的分区值") let realm = try Realm(configuration: config) realm.syncSession?.addErrorNotificationBlock { _, error in if let syncError = error as? SyncError, syncError.code == .invalidSession || syncError.code == .userNotFound { user.logOut() // 更新本地状态或提示用户 } }
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

