ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

google_sign_in 插件版本演进全解析:从 0.0.1 到 7.2.0 的架构变迁与升级指南

google_sign_in 插件版本演进全解析:从 0.0.1 到 7.2.0 的架构变迁与升级指南 google_sign_in 插件版本演进全解析从 0.0.1 到 7.2.0 的架构变迁与升级指南【免费下载链接】packagesA collection of useful packages maintained by the Flutter team项目地址: https://gitcode.com/GitHub_Trending/pac/packages导读本文以 Flutter 官方团队维护的google_sign_in插件仓库路径 packages/google_sign_in/google_sign_in的完整 CHANGELOG 为主线梳理该插件十余年来的版本演进脉络。通过阅读本文你将掌握7.x 引入的单例 initialize 认证/授权分离的全新 API 模型及其迁移要点、Web 端从旧版 Google Sign-In SDK 到 Google Identity ServicesGIS的迁移背景、Android/iOS 联邦化federated插件架构的成因以及各版本对 Flutter/Dart SDK 最低版本的要求变化从而在升级依赖、排查兼容性问题时具备清晰的决策依据。一、版本总览一条清晰的能力演进主线google_sign_in的 CHANGELOGCHANGELOG.md记录了从 0.0.1 到 7.2.0 的每一次发布。纵观全部条目演进主线可以归纳为四个阶段阶段版本区间核心主题起步期0.0.1 ~ 3.x打通 Android/iOS 原生 SDK 接入修复并发、崩溃等问题平台接口联邦化4.x ~ 5.x引入 platform interface、AndroidX 迁移、Web 支持、null safetyWeb 技术栈切换6.0.0从 Google Sign-In for Web JS SDK 切换到 Google Identity ServicesGISAPI 全面重构7.x单例化、显式initialize、认证与授权彻底分离从源码看当前版本 pubspec.yaml 声明了完整的联邦化结构Android 由google_sign_in_android、iOS/macOS 由google_sign_in_ios、Web 由google_sign_in_web分别实现主包只负责 API 面与事件流编排这与 CHANGELOG 中 5.3.0 的“Moves Android and iOS implementations to federated packages”完全对应。二、7.x面向新一代平台 SDK 的破坏性重构7.0.0 是 CHANGELOG 中标注最醒目的破坏性版本BREAKING CHANGE。其背景是旧的 Google Sign-In SDK 在 Android 与 Web 上均已被弃用新一代 SDK 的 API 结构差异巨大因此插件 API 面发生了系统性变化。核心变更包括GoogleSignIn变为单例通过GoogleSignIn.instance获取。源码 google_sign_in.dart 中构造函数被私有化仅暴露static final GoogleSignIn instance。6.x 时代创建多个实例本就无法正常工作单例化只是把既有限制固化下来。新增显式initialize步骤调用其他任何方法之前必须恰好调用一次并等待其 Future 完成重复调用或未等待完成都属于未定义行为7.1.1 为此补充了文档说明。initialize接受clientId、serverClientId、nonce、hostedDomain四个可选参数见 google_sign_in.dart传入值优先于配置文件。认证Authentication与授权Authorization分离authenticate()负责交互式登录并返回GoogleSignInAccount访问令牌与服务器授权码则通过独立的授权流程获取不再随登录一次返回。访问令牌与服务器授权码分开获取这是 7.x 最重要的数据流变化详见下文第四节。7.2.0 新增了clearAuthorizationToken方法用于从本地授权缓存中移除失效的访问令牌7.1.0 则补上了GoogleSignInExceptionCode的导出使客户端可以按错误码做结构化错误处理如区分canceled与网络错误。从 6.x 迁移到 7.x 的关键差异仓库中的 MIGRATION.md 系统列出了 6.x 与 7.x 的差异与 CHANGELOG 相互印证6.x 及更早7.x说明GoogleSignIn(...)构造GoogleSignIn.instance单例强制既有限制创建即用先await initialize()Web 等平台可能需要较长时间插件追踪“当前用户”应用层通过authenticationEvents流自行追踪流事件类型见 event_types.dartsignInauthenticate 授权步骤分离supportsAuthenticate()为 false 的平台如 Web需用 SDK 提供的按钮signInSilentlyattemptLightweightAuthentication不再保证“静默”Web 上可能弹出浮动登录卡片Android 上可能弹出账户选择面板且不再保证返回 FuturecanAccessScopesaddScopesauthorizationForScopesauthorizeScopes先静默探测再按需交互授权clearAuthCacheclearAuthorizationToken以 access token 为粒度错误多为布尔/空返回统一抛出GoogleSignInException取消登录也会抛异常code为canceled三、新的认证/授权 API 模型事件流驱动 两步授权7.x 的源码清晰地展示了这套新模型的实现方式。3.1 初始化与轻量认证示例应用 example/lib/main.dart 给出了标准接入模式initialize完成后订阅authenticationEvents流再调用attemptLightweightAuthentication尝试恢复登录态final GoogleSignIn signIn GoogleSignIn.instance; unawaited( signIn.initialize(clientId: clientId, serverClientId: serverClientId).then((_) { signIn.authenticationEvents .listen(_handleAuthenticationEvent) .onError(_handleAuthenticationError); signIn.attemptLightweightAuthentication(); }), );attemptLightweightAuthentication有两种返回模式见 google_sign_in.dart若平台能快速给出确定结果则返回Future成功返回GoogleSignInAccount未登录返回 null若平台如 Web 的 FedCM可能需要任意时长则返回 null应用应默认按未登录处理直到authenticationEvents流推送登录事件。默认情况下取消、中断、UI 不可用等错误会被吞掉并返回 null如需这些错误抛异常可传reportAllExceptions: true。3.2 显式认证与平台能力探测对支持自定义 UI 触发登录的平台使用authenticate()是否支持通过supportsAuthenticate()在运行时判断。当前唯一不支持的是 Web需改用google_sign_in_web提供的renderButton。源码 google_sign_in.dart 中authenticate接受scopeHint列表——它只是“偏好提示”平台可忽略因此授权步骤永远不能依赖它已生效。3.3 授权静默探测、交互授权与服务器授权码7.x 的授权能力集中在GoogleSignInAuthorizationClient源码见 google_sign_in.dart可通过GoogleSignIn.instance.authorizationClient或GoogleSignInAccount.authorizationClient获取authorizationForScopes(scopes)若 scopes 已被授权则静默返回访问令牌否则返回 null不弹 UI。authorizeScopes(scopes)发起交互式授权必定返回令牌或抛异常在authorizationRequiresUserInteraction()返回 true 的平台如 Web 弹窗场景必须由按钮点击等用户交互触发否则会被浏览器拦截。authorizationHeaders(scopes)便捷方法返回可直接用于 REST 请求的 HTTP 头如Authorization: Bearer accessToken、X-Goog-AuthUser: 0。示例应用正是用它调用 People API见 example/lib/main.dart。authorizeServer(scopes)获取服务器授权码serverAuthCode供后端换取 access/refresh token。CHANGELOG 与 README 均强调部分平台只在首次登录时提供有效服务器授权码应尽早获取并在服务端维护刷新。令牌封装在 token_types.dartGoogleSignInAuthenticationidToken、GoogleSignInClientAuthorizationaccessToken、GoogleSignInServerAuthorizationserverAuthCode。另外需注意 README 明确提示Web 端 access token 不再自动刷新约 3600 秒1 小时后过期应用必须处理 REST 请求 401/403 并引导用户重新授权。示例中的_handleGetContact正是对 401/403 做出响应并提示重新授权的完整范例。四、6.xWeb 技术栈切换与 macOS 支持6.0.0 是 Web 平台的破坏性版本将默认 Web 实现升级为google_sign_in_web ^0.11.0底层从即将于 2023 年 3 月 31 日后弃用的 Google Sign-In for Web JS SDK 切换到Google Identity Services (GIS) SDK除 Web 外该版本与 5.4.4 完全一致。6.1.0 引入canAccessScopes方法但仅 Web 实现有效其他平台调用会抛UnimplementedError同版本还调整了 Web 上signInSilently的行为——成功后重新返回 User 对象。6.2.0 正式支持 macOS由google_sign_in_ios同时承载见 pubspec.yaml 的 platform 声明。6.2.2 起 README 中的支持矩阵不再包含 iOS 11。6.3.0 为 Android 增加了显式指定账户名的登录字段该能力仅 Android 底层库支持。Web 访问令牌的 1 小时过期、GIS 弹窗对用户手势的要求共同决定了 7.x 中authorizationRequiresUserInteraction与“先静默探测再交互授权”的设计——这正是从 6.x 到 7.x 一脉相承的约束。五、5.x 与更早版本联邦化、null safety 与 serverAuthCode5.x 是承上启下的架构期5.0.0迁移到 null safetyDart 空安全这也是 5.x 起点。5.2.0新增GoogleSignInAccount.serverAuthCode同时将GoogleSignInAuthentication.serverAuthCode标记为废弃。5.3.0Android 与 iOS 实现迁出为联邦化包主包开始以 platform interface 为核心。5.4.0支持通过构造函数配置serverClientId并允许用 Dart 配置替代 iOS 的GoogleService-Info.plist。5.4.2默认新增forceCodeForRefreshToken请求属性并支持initWithParams覆写。依赖与构建层面5.0.4 将 Maven 仓库从 jcenter 迁到 mavenCentral5.2.3 升级play-services-auth从而移除 jetifier 需求5.2.2 将 compileSdkVersion 提升到 31。更早的 4.x 则记录了平台接口联邦化的前奏4.0.14 从直接使用 MethodChannel 改为基于联邦化 Platform Interface4.0.0 完成 AndroidX 迁移此前的 3.3.0 曾误发破坏性更新随后被 3.3.01 回滚属于 CHANGELOG 中罕见的版本事故值得关注4.1.0 默认支持 Web4.1.2 新增network_error错误码。4.0.8 中用链式 Future 替代MethodCompleter以修复错误处理区域中登录方法的竞态 bug则是并发正确性方面的重要修复。六、SDK 版本约束与平台支持演进CHANGELOG 中频繁出现“Updates minimum supported SDK version”这些约束对升级决策至关重要汇总如下以当前仓库 pubspec.yaml 为准environment: sdk ^3.10.0, flutter 3.38.0版本最低 Flutter最低 Dart平台变化NEXT / 当前3.383.10README 更新为最新受支持 OS 版本7.2.03.293.7—6.3.03.273.6Android 支持指定账户名6.2.23.193.3iOS 11 不再支持6.2.03.16—新增 macOS6.1.53.72.19新增 pub topics6.1.03.3——5.4.22.10——5.1.12.5—iOS 最低 9.0平台支持矩阵当前 READMEAndroid SDK 24、iOS 13.0、macOS 10.15、Web 任意版本。需要特别说明的是使用旧版 Flutter 构建的应用仍可使用兼容的旧版平台实现包但不会获得后续更新如 iOS 11 场景见 6.2.2 条目。七、升级实践建议综合 CHANGELOG、MIGRATION.md 与 README给出如下升级路径建议直接以 7.x 为升级目标6.x 及更早的 API 面向已弃用的旧平台 SDK新项目应直接使用 7.x 的GoogleSignIn.instanceinitialize模型。重构登录态管理放弃“插件替你记住当前用户”的假设改为订阅authenticationEvents流事件类型GoogleSignInAuthenticationEventSignIn/SignOut定义于 event_types.dart在应用层维护用户状态。认证与授权分离应用启动尽早attemptLightweightAuthentication到真正需要用户数据时再走authorizationForScopes→authorizeScopes的探测-授权两步流程需要后端接入时尽早authorizeServer并妥善保管serverAuthCode。正确处理错误用GoogleSignInExceptionGoogleSignInExceptionCode做结构化错误分支取消、网络错误、配置错误等示例 example/lib/main.dart 展示了按code分支的推荐写法。关注 Web 令牌过期Web 端 access token 约 1 小时过期且不自动刷新务必对 REST 401/403 做出“重新授权”的用户引导。核对 SDK 约束升级前对照上表确认项目的 Flutter/Dart 版本满足要求避免低版本 Flutter 与新版插件不兼容。平台集成细节Android 的 OAuth 客户端配置、iOS 的GoogleService-Info.plist、Web 的客户端 ID 配置请分别参考对应实现包的 READMEgoogle_sign_in_android、google_sign_in_ios、google_sign_in_web。测试侧仓库中的 google_sign_in_test.dart 与示例的集成测试 google_sign_in_test.dart 可作为理解新 API 行为边界的第一手参考。结语从 CHANGELOG 可以清晰看到google_sign_in的每一次大版本跃迁都不是孤立的版本号变化而是对底层平台 SDK 演进的忠实跟随旧 Web SDK 弃用催生了 6.0.0 的 GIS 切换Android/Web 原生 SDK 重构催生了 7.x 的 API 全面重设计。理解这份演进史不仅能帮助你在升级时少踩坑更能让你在设计自己的登录与授权流程时遵循“认证先行、按需授权、令牌生命周期管理”这套经过官方验证的最佳实践。【免费下载链接】packagesA collection of useful packages maintained by the Flutter team项目地址: https://gitcode.com/GitHub_Trending/pac/packages创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表