iOS — Apple 登录(ROLoginApple)
模块目录:Modules/ROLoginApple。使用系统 AuthenticationServices,最低 iOS 12,不需要导入 Google、支付或 Adjust。
安装
pod 'ROLoginApple', :path => '<本机roios-sdk>/Modules/ROLoginApple'游戏既有 Platform 调用
// 从游戏已有 UIViewController / UIWindow 与后端授权会话拿到这些参数。
[[ROLoginApple shared] authorizeFromWindow:window
nonce:nonceFromServer state:randomStateFromServer
completion:^(ROLoginAppleResult *result, NSError *error, BOOL cancelled) {
if (cancelled) { /* 映射到原 SDKDelegate 的取消结果 */ return; }
if (error) { /* 映射到原 SDKDelegate 的错误结果 */ return; }
// 使用 HTTPS 只发送 identityToken/authorizationCode 给游戏服务端验证。
// 不能把客户端回调直接当作游戏登录成功。
}];结果包含 Apple userIdentifier、identityToken、authorizationCode 和首授权时可能出现的 email/fullName。内置 state 一致性校验;服务端仍须验证 nonce、token 签名、audience 和重放。
宿主配置
Apple Developer 中的 Bundle ID 与 Team ID 必须匹配签名;在真实游戏 App target 开启 Sign In with Apple Capability。主线程前台调用,取消与错误单独处理,回调后端完成游戏账号绑定。请在有有效签名、Capabilities 和 Apple ID 的设备上验证取消、失败、再次登录和首次授权资料返回。
完整公开 API / 可选调用方式
| ObjC 接口 | 用法和回调 |
|---|---|
[ROLoginApple shared] | 取得 Apple 原生授权模块 |
authorizeFromWindow:nonce:state:completion: | 主线程,从有效 ASPresentationAnchor 授权;随机 nonce/state 应由可信宿主生成并校验 |
ROLoginAppleCompletion(result,error,cancelled) | 区分授权成功、取消、系统错误 |
ROLoginAppleResult.userIdentifier | Apple 用户标识,不等于游戏账号 |
identityToken / authorizationCode | 敏感授权凭证,后端必须验签/兑换,不打印日志 |
email / fullName | 首次授权时可能存在,后续可能为空,不得作为固定必需身份 |
checkCredentialState:completion: | 可选查询 Apple 授权状态(撤销、转移、有效等) |
initWithCredential: | Result 类型的公开构造方法;普通业务优先使用授权 Completion,而非自行拼装 |
[[ROLoginApple shared] authorizeFromWindow:window
nonce:hostGeneratedHashedNonce
state:secureState
completion:^(ROLoginAppleResult *result, NSError *error, BOOL cancelled) {
if (result) {
// 将 identityToken/authorizationCode 安全交游戏服务器验证,
// 后端完成 account/token 兑换后宿主才给 sdk.login() 返回成功。
}
}];
// 可选:账号管理时检查之前保存的用户标识授权状态:
// [[ROLoginApple shared] checkCredentialState:userID completion:^(ASAuthorizationAppleIDProviderCredentialState s, NSError *e) {}];此处 hostGeneratedHashedNonce 为宿主通过安全随机原始 nonce 计算出的 SHA256 字符串;若随后绑定 Firebase,Core 需要保存对应原始 nonce,不能错传哈希值。Apple 登录与 Firebase 认证仍是两个不同模块:仅需 Apple 平台身份可不安装 Firebase;若要 Firebase 会话,应使用 Core 的 Apple credential 兑换 API,保留 nonce 校验。
首版前 API 与结果回调核验(2026-10-28)
原生 Apple 授权由 authorizeFromWindow:nonce:state:completion: 返回成功凭据、NSError 和是否取消;授权状态查询 checkCredentialState:completion: 也不会在非空 completion 情况下静默丢掉空 userIdentifier,会回传 NotFound + NSError。系统授予的 identityToken/authorizationCode 必须由真实游戏后端验签/兑换,不等于已完成游戏 sdk.login()。平台不需要业务 SDKManager Adapter,也不需要空的独立 init。