在 iOS 上使用 Firebase SDK 作为全新设备开始
Posted
技术标签:
【中文标题】在 iOS 上使用 Firebase SDK 作为全新设备开始【英文标题】:Start as a fresh device with Firebase SDK on iOS 【发布时间】:2019-03-05 22:36:34 【问题描述】:我正在使用官方 SDK 在 ios 应用中实现 Firebase(准确地说是身份验证、实时数据库和 Firebase)。用户作为匿名用户进行身份验证,其余的取决于成功的身份验证。
问题是我在测试“全新安装”场景时遇到了问题,因为即使在卸载应用程序或以编程方式从 /Documents 文件夹中删除 Firebase 文件后,SDK 似乎也分配了相同的 UID(用户 ID)。
这给我带来了问题,因为之前安装的设备与新设备的行为不同,因此很难调试“新下载”应用程序的启动过程。
使用 Firebase 控制台删除用户也无济于事,因为只要令牌有效,用户仍然可以保持访问权限,而且即使在删除并重新安装应用后,令牌似乎仍然有效。
关于如何处理该问题的任何想法或指导?
【问题讨论】:
您有确切的复制步骤和代码要显示吗?用户 ID 不应在应用卸载后继续存在。永远不应重新分配用户 ID。此外,在删除用户帐户后,令牌在上次刷新后的一个小时内不应继续工作。 没什么奇特的,我使用的是 XCode 10,设备在 iOS12 上,并且我为 SDK 安装了最新的 Pod。该应用程序主要使用 SpriteKit 构建,当加载场景时,会按照 Firebase SDK 中的说明执行匿名用户身份验证。一段时间后令牌会失效,但重新安装后会分配相同的 UID,就好像该应用从未被删除一样。 在新设备上,Auth.auth().currentUser?.uid 在设备通过身份验证之前为零,但在重新安装时,即使根本没有互联网连接,它也会返回相同的 UID。更新 pod 后,我能够在同一设备上获得新的 UID,我认为是在清理一些非必要文件以恢复空间之后。 【参考方案1】:有一个解决您面临的问题的方法。每次检测到全新安装时,都需要强制注销以前的用户。
每次匿名验证用户时,将用户 ID 存储到 UserDefaults
。
UserDefaults.standard.set("ENTER_USERID_HERE", forKey: "user_ID")
每次启动应用时,检查用户 ID 是否设置为 UserDefaults
。
如果用户 ID 不存在,则它是全新安装。如果是这种情况,您需要退出用户来解决您的问题。
if UserDefaults.standard.object(forKey: "user_ID") == nil
let firebaseAuth = Auth.auth()
do
try firebaseAuth.signOut()
catch let signOutError as NSError
print ("Error signing out: %@", signOutError)
注意:这是一种解决方法,您应该只在测试时使用它。
【讨论】:
太棒了!这非常有效。不过,我仍然很好奇,Firebase 如何在安装之间直接从 XCode(不是 iCloud 备份)维护 UID。我想我已经读过 UID 是使用当前日期/时间生成的,但可能是设备 ID(Apple 没有采取措施吗?)。嗯,也许我应该尝试重置广告 ID。 我相信 Firebase 将用户会话相关信息存储在设备的钥匙串服务中。即使删除应用程序后,存储在钥匙串中的数据仍然存在。在此处查看更多信息:developer.apple.com/documentation/security/keychain_services以上是关于在 iOS 上使用 Firebase SDK 作为全新设备开始的主要内容,如果未能解决你的问题,请参考以下文章
Firebase iOS SDK 崩溃与 FIRInstallations validateAppOptions:appName
使用私有Google存储的Firebase iOS SDK身份验证
Firebase iOS 6.30.0 SDK 崩溃 - GPBCreateMessageWithAutocreator