Skip to content

原生 SDK 登录界面、交互体验与多语言规范(设计约定) ​

状态:2026-10-26 需求已确认、源码与完整测试仍待实施。本页约束 Android / iOS ROSDK 中所有可能出现 UI 或面向用户提示的模块。它不代表 Firebase Auth 或登录 UI 已经构建、发布或在真机通过。

目标及边界 ​

Firebase 提供通用 Firebase User/UID/ID Token、会话与凭证认证;为保证体验,ROSDK 另外提供按需选装的原生登录选择界面和交互协调层。它不访问游戏服务端、不实现 auth.Auth、不兑换游戏 account/token、不处理角色或游戏数据合并、不依赖 Egret/SDKManager/SDKDelegate。

模块候选:Android auth-firebase + 可选 auth-firebase-ui;iOS ROAuthFirebase + 可选 ROAuthFirebaseUI。是否采用这些最终制品名以实现时的模块规范为准。认证 Core 不引入 UI、Google、Apple 的强制依赖;UI 模块不依赖 Egret,不绑定所有 Provider。 每个游戏仅组合实际需要的模块及授权处理器;宿主负责向游戏既有协议映射结果。现有 Google / Apple 登录模块继续独立可用。

登录方式配置 ​

与 roweb-sdk 的 FirebaseLoginMethods 位值保持语义一致,以便阅读配置,但 Web Provider 已列出不表示原生已接入。

位值登录方式Android / iOS 当前状态
1Google待在 Firebase Core + 对应授权处理器中实现并验收
2Facebook待实现,不显示空按钮
4GitHub待实现,不显示空按钮
8Twitter/X待实现,不显示空按钮
16Microsoft待实现,不显示空按钮
32Yahoo待实现,不显示空按钮
64Apple待按平台身份流程实现并验收
128 / 256Email / PhoneWeb 预留位;原生需专用输入 UI,不视为完成
512Anonymous(游客)待基于 signInAnonymously 实现并验收
1024 及以上Play Games、Game Center、OIDC、SAML 等Web 预留位;按能力单独提 Issue、实现、测试

可见方法 = 宿主配置允许 ∩ 当前 OS / 宿主条件允许 ∩ 有已注册且可工作的授权处理器。如果没有可用方式,显示可本地化的“当前没有可用登录方式”并向调用方返回明确错误,不展示无法点击的假入口。支持自定义展示顺序、名称和品牌合规布局;游戏不必安装全量 Provider。

建议配置模型(示意,不是已有源码):

text
FirebaseLoginUIOptions
  loginMethods: 位掩码
  preferredOrder: 登录方式数组(未设置则默认顺序)
  showCachedAccount: true
  autoContinueSeconds: 0(默认关闭;游戏可设置如 3)
  allowSwitchAccount: true
  showAnonymousWarning: true
  providerHandlers: 每个方法对应独立授权能力回调
  language: SYSTEM(当前固定策略;不接收 Egret 游戏语言)

Core 提供 signInWithCredential、linkWithCredential、reauthenticate、signInAnonymously、getIdToken(forceRefresh)、状态监听、退出及明确错误结果;可选 UI 只协调授权按钮与 Core API。Google / Apple 原生 SDK 返回的 Google/Apple 身份凭证 不是 Firebase ID Token。iOS Google Firebase 凭证需使用 ID Token + Access Token,不可把 serverAuthCode 当 Access Token;Apple 必须保存 raw nonce,向 Apple 请求提交 SHA256(raw nonce),向 Firebase 构建凭证使用 raw nonce,首次授权姓名在可用时传递。Android Apple 网页一次性游戏后端 code 不可直接冒充 Firebase 身份凭证,需使用 Firebase 官方支持的 Apple OAuth 授权路径并正确恢复 pending result。

原生登录界面与流程状态 ​

  • 初始:Firebase 初始化并监听认证状态;无缓存账号展示可用 Provider;已有 Firebase User 展示非敏感账号摘要、“继续”、“切换账号”。缓存令牌应通过 getIdToken 重新确认,不凭 UID 就向游戏报告成功。倒计时自动继续仅当宿主显式启用,且可被用户取消。
  • 授权:用户明确点击 Provider 按钮 → 进入 AUTHORIZING → 阻止重复提交 → 显示带取消语义的 Loading → 唤起授权界面 → 获得 provider 原始凭证 → FIREBASE_AUTHENTICATING → 获取 Firebase User + ID Token → SUCCEEDED。绑定/重认证使用独立模式,绝不误调用新登录造成匿名 UID 被替换。
  • 失败:明确区分用户取消、无网络、超时、提供方不可用、Firebase 配置错误、凭证冲突、匿名账号链接冲突、需要最近重新登录和未知错误。展示面向用户的本地化提示、允许重试/切换方式;原始异常码作为开发诊断交给回调,不直接显示给普通用户。
  • Loading/遮罩:只阻拦 SDK 自己当前 UI 的重复触摸,不锁死操作系统/游戏主线程;在失败、取消、成功、窗口销毁和生命周期中断时释放。超时表示 UI 不再等待,不等于第三方请求已取消;迟到回调必须去重且不能多次完成;Firebase 状态如已变化应正确通知监听者。授权系统 UI 不被 SDK 遮罩盖住。
  • 安全:不记录 ID Token、授权码、完整邮箱和用户机密;可记录脱敏错误码、阶段与耗时。切换账号须有清晰提示,不能默默抹掉正在使用的匿名身份或未保存游戏进度。账号合并仅由游戏后端决定。

建议状态:IDLE → CHOOSING / CACHED_ACCOUNT → AUTHORIZING → FIREBASE_AUTHENTICATING → REFRESHING_TOKEN → SUCCEEDED,并对 CANCELLED、FAILED、TIMED_OUT 提供恢复路径。登录、链接、重新认证模式应分别测试。

SDK UI 多语言规则 ​

当前只看操作系统语言,不跟随 Egret 游戏内部语言设置。游戏即使切换至另一种语言,SDK 自己的提示、Loading、按钮仍按系统语言;两套语言可以不一致,暂不实现游戏侧统一切换。首批 en、zh、th、id,不支持的语言回退 en;扩展语言时先补齐同模块全套字符串及无障碍说明。

  • Android:优先模块私有 res/values/strings.xml(英文)、values-zh、values-th、values-in 或经工具链验证的印尼语资源目录,全部字符串统一 rosdk_<module>_ 前缀。若宿主通过自定义 Locale 改写 App/进程语言,而要求严格使用系统语言,不能仅依赖 Activity 的 getString;需基于真实系统语言取得模块字符串并实际测试 API 23+。不能修改固定 Egret 的资源或全局 Locale。
  • iOS:每个 Pod 以 Resources/*.lproj、Localizable.strings 和 s.resource_bundles 分发,以模块 Bundle 读取文案,不假设 [NSBundle mainBundle] 包含 SDK 自有语言资源;尊重系统语言列表、合理回退。iOS 的每 App 语言设置也可能影响 OS/第三方授权界面的语言。
  • 所有 ROSDK 模块:支付处理中、恢复交易、账号取消、网络错误、成就提示等,只要是 SDK 主动生成的 UI/提示,就使用所在模块的本地化资源和可诊断的错误码;纯无界面模块无需引入本地化依赖或新的统一 Core。官方 Google/Apple、商店、权限系统窗口由 OS/供应商选择语言,ROSDK 无法保证逐字相同。

模块级验收及发行门槛 ​

  1. 只有 Firebase Core 安装时,原有五模块与 Firebase 不互相污染依赖;不安装 UI 时不携带 UI 资源或额外 Google/Apple 依赖;UI 单独选装后至少能以匿名方式完成纯 SDK 验证。
  2. 按配置只显示注册完成的按钮、按钮可点击且能走到实际授权处理器;关闭模块后对应方式消失;系统不支持时明确反馈。
  3. Android Maven Local → 传递依赖 → 独立 D8/APK → 与已有五模块联合 APK;旧 Egret AGP 兼容性留到正式项目验收。iOS 独立 Pod lint/XCTest、联合 Simulator Release、CocoaPods 同 URL split Tag 混装与最低 iOS 验证。
  4. en/zh/th/id 文案覆盖及系统语言切换、未知语言回退、无障碍字体/RTL 回退、前后台切换、销毁恢复、多次点击、超时和迟到回调、授权取消/失败/重试。
  5. 真实 Google/Apple/Firebase Console、设备与签名、跨 Web/Android/iOS UID、游戏服务器 auth.Auth 和账号映射,只在真实游戏项目完成联调。仓库 SmokeApp 通过不等于正式游戏验收。

参考:

每个能力独立发布与接入;正式项目验收必须使用真实游戏环境。