FACEBOOK.md 6.2 KB

Facebook iOS 接入(Creator 3.8.x)

实现初始化、优先 Facebook App 登录及 Limited Login 网页回退、登出、链接分享、自定义事件、购买事件和事件刷新。 TypeScript 的 FBIOSImpl 与 Android 共用 FBNativeImpl 请求桥;原生由 service/FBWrapper.mm 实现。 AppDelegate 直接持有 FBWrapper 单例,无需在 service.json 再次注册。

在 Mac 上构建

  1. 直接维护本目录的 Info.plist,然后在 Creator 构建并生成 Xcode 工程。sdk-manager 已弃用,不依赖构建面板配置。 FacebookAppID、FacebookClientToken 已沿用 Android 当前配置;FacebookAutoLogAppEventsEnabled 为 false,与 Android 一致。 修改 App ID 时,必须同时更新 CFBundleURLTypes 中的 fb<AppID>。保留 LSApplicationQueriesSchemes 中的 fbapi、fbauth2 和 fb-messenger-share-api。 登录不请求 ATT 授权,也不由业务代码检查或修改 ATT 状态;交给 Facebook SDK 处理。
  2. 安装 CocoaPods 后,在本目录执行(替换为生成工程的实际绝对路径):

    COCOS_IOS_PROJECT="/absolute/path/game_2c.xcodeproj" pod install
    

若 target 改名,额外设置 COCOS_IOS_TARGET="实际 target 名"。 SDK 固定为 18.1.1(CoreKit/LoginKit/ShareKit),最低 iOS 12。

  1. 打开生成工程旁的 game_2c.xcworkspace(名称由 Podfile 的 workspace 指定),设置签名,在 iPhone 上运行。 Creator 重新生成 Xcode 工程后,重新执行 pod install;不要只打开 xcodeproj。
  2. 在 Meta 后台增加 iOS 平台,Bundle ID 必须与实际包一致;开发模式账号须有应用角色/测试权限。

当前 Windows 环境未进行 Xcode 编译、CocoaPods 安装或真机验证。

Objective-C++ 找不到 Facebook 类型

FBWrapper.mm 需要同时导入 CoreKit、LoginKit、ShareKit 的普通头文件和对应的 模块名-Swift.h。 在这些 Facebook 头文件之前导入 SafariServices/SafariServices.h 和 AuthenticationServices/AuthenticationServices.h, 以提供 SFSafariViewControllerDelegate 和 ASWebAuthenticationPresentationContextProviding 的完整协议声明;不要修改 Pods 中生成的头文件。 SDK 中 Swift 实现的登录类、分享协议通过这些生成头文件暴露给 Objective-C++。 若出现 Unknown type name FBSDKLoginManager 或找不到 FBSDKSharingDelegate,先确认这些导入已同步到 Mac。 仅修改 .mm 导入后无需重新安装 Pods;在 Xcode 执行 Product → Clean Build Folder 后重新 Build。 若报的是 -Swift.h file not found,则检查 Pods 安装、应用 target 和 workspace 是否匹配。

JsbBridgeWrapper 回调崩溃

Creator 3.8.8 的 addScriptEventListener:listener: 使用 MRC,保存 listener 后会调用 [listener release]。 FBWrapper 的注册入口使用不捕获 self 或局部变量的全局 Block,避免临时 Block 的生命周期与引擎所有权处理不匹配。 不要将该入口改回捕获 self 的匿名 Block;在回调内通过 [FBWrapper shared] 获取实例。 同步 FBWrapper.mm 后重新编译,在真机验证初始化、登录和事件调用。此修复无需修改 Creator 安装目录中的引擎源码。

登录结果与后端

参考用户提供的 Unity 工程 Libraries/FacebookSDK/SDK/Editor/iOS/FBUnityInterface.mm: 安装了 Facebook App(fbapi 和 fbauth2 检测通过)时,与 Unity startLogin 一致,创建 FBSDKLoginManager 并调用 logInWithPermissions:fromViewController:nil handler:。 没有安装时使用 FBSDKLoginTrackingLimited + FBSDKAppSwitchDisabled,直接进入 Limited Login 网页。 不再由 Cocos 依据 ATT 提前切换模式,也不读写追踪开关。普通入口的实际登录模式和跳转方式由 SDK 决定。 两条分支共用成功、取消和失败回调,并读取本次结果的 Access Token 或 Authentication Token;JWT 的 nonce 从实际 Authentication Token 读取。 取消登录保持取消,不自动再次弹出另一个登录窗口。

安装 App 不等于一定能够跳 App:SDK 18.1.1 还检查 Meta 的普通/受限登录 Fast App Switch 功能开关。 若功能未开放或跳转失败,SDK 会回退网页;Limited Login 会进入 limited.facebook.com。客户端不能保证或绕过这些条件。 参考:https://github.com/facebook/facebook-ios-sdk/blob/v18.1.1/FBSDKLoginKit/FBSDKLoginKit/Internal/NativeAppLoginHandler.swift

普通登录返回 accessToken 和 tokenType: 'access',继续现有服务器登录接口。 Limited Login 返回 authenticationToken(JWT)、nonce 和 tokenType: 'authentication',accessToken 为空,不调用 Graph API /me。 status: 'connected' 只表示 Facebook 授权成功,不代表已经取得游戏服务器会话。

用户已确认当前后端不支持 JWT,因此 Limited Login 的游戏账号登录尚未接通。LoginService 会明确提示服务器未支持,不把 JWT 当 Access Token 发送。 后端需要增加 OIDC/JWT 验证,校验签名、issuer、audience/App ID、有效期和与登录请求绑定的 nonce,并防止重放;随后约定客户端请求字段再接通。 客户端无法把 Limited Login JWT 换成可供旧 Graph API 接口验证的普通 Access Token。两种模式都需要服务器独立验证身份。

验证清单

  • 初始化失败能返回配置错误;正常初始化后 isInitialized 为 true。
  • 真机登录成功/取消/失败;浏览器或 Facebook App 返回游戏;登出后可再次登录。
  • 已安装/未安装 Facebook App,分别结合 ATT 已允许/已拒绝/未确定状态测试;均不应弹 ATT 或因拒绝而阻断 Facebook 授权。
  • 普通 Access Token 继续服务器登录;JWT 正确回传 nonce,并显示后端尚未支持提示;日志中不得包含完整令牌。
  • 链接分享成功/取消/失败;重复操作被拒绝。
  • Meta 测试事件里检查 logEvent、logPurchase 和 flushEvents;返回 true 仅代表本地 SDK 接受调用。
  • 自动应用事件由 FacebookAutoLogAppEventsEnabled 控制;手动事件仍由业务显式调用。
  • 重复构建及修改 App ID 后检查 Info.plist URL Scheme,其他 SDK Scheme 应保留。

依赖来源:https://github.com/facebook/facebook-ios-sdk/tree/v18.1.1