# Facebook iOS 接入(Creator 3.8.x) 实现初始化、普通 Facebook 登录及 Graph API 校验、登出、链接分享、自定义事件、购买事件和事件刷新。 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`。保留 `LSApplicationQueriesSchemes` 中的 `fbapi`、`fbauth2` 和 `fb-messenger-share-api`。 `NSUserTrackingUsageDescription` 用于首次登录时的 ATT 系统弹窗,发布前确认说明与实际数据用途一致。 2. 安装 CocoaPods 后,在本目录执行(替换为生成工程的实际绝对路径): ```sh COCOS_IOS_PROJECT="/absolute/path/game_2c.xcodeproj" pod install ``` 若 target 改名,额外设置 `COCOS_IOS_TARGET="实际 target 名"`。 SDK 固定为 18.1.1(CoreKit/LoginKit/ShareKit),最低 iOS 12。 3. 打开生成工程旁的 `game_2c.xcworkspace`(名称由 Podfile 的 workspace 指定),设置签名,在 iPhone 上运行。 Creator 重新生成 Xcode 工程后,重新执行 pod install;不要只打开 xcodeproj。 4. 在 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 安装目录中的引擎源码。 ## 登录结果与后端 当前使用 `FBSDKLoginTrackingEnabled`。iOS 14+ 在 ATT 状态未确定时请求一次系统授权;拒绝或受限时明确返回错误,用户可使用现有游客或账号等其他登录方式。 iOS 14–16 将实际 ATT 结果同步给 SDK;iOS 17+ 由 SDK 自行读取系统授权状态,不伪造授权。 授权成功后读取本次登录结果的 Access Token,并调用 Graph API `GET /me?fields=id`,只有返回有效用户 ID 才报告登录成功。 SDK 未返回 Access Token(包括回退为 Limited Login 的情况)或 Graph API 请求失败时返回错误,不把 JWT 当成 Access Token。 TypeScript 成功结果的 `accessToken` 交给现有 `login3rd('facebook', token)`,服务端仍须独立验证令牌有效性、所属 App ID 和用户身份,客户端 `/me` 校验不能替代服务端校验。 LoginService 对失败显示原因、取消静默返回,不再输出完整登录令牌。业务请求协议和 TrackEvents.ts 不变。 Graph API 本身不是登录页面:登录授权仍由 Facebook SDK 完成,Graph API 用于授权后的令牌/用户信息验证。 ## 验证清单 - 初始化失败能返回配置错误;正常初始化后 isInitialized 为 true。 - 真机登录成功/取消/失败;浏览器或 Facebook App 返回游戏;登出后可再次登录。 - 首次 ATT 允许/拒绝、已拒绝和系统限制场景;允许后 Graph API 成功并继续服务器登录,其他情况可使用其他登录方式。 - Graph API 网络失败或令牌不可用时应显示错误,并可重试;日志中不得包含完整令牌。 - 链接分享成功/取消/失败;重复操作被拒绝。 - 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