threejs-game-ad-integration
Installation
SKILL.md
three.js AppLovin MAX 广告接入
适用范围与硬边界
本 Skill 只处理 three.js + TypeScript/Vite + Capacitor 移动项目的 Banner、插页与激励视频广告能力,聚合层固定使用 AppLovin MAX,接入实现固定使用 AppLovin 官方维护的 cordova-plugin-applovin-max,由 Capacitor 的 Cordova 兼容层加载。项目只在 TypeScript 侧建立业务门面和官方插件 API 适配,不自建 Android/iOS 广告插件,也不直接集成 MAX 原生 SDK。所有已配置广告位独立维护状态;插页与激励视频只在后台静默预加载,不在初始化阶段主动创建广告对象或视图,插件内部按需管理加载资源。插页与激励视频预加载成功以当前广告实例对象的就绪属性为准,loaded 回调和业务 phase 不能单独证明成功。全屏展示读取实例就绪属性与现有业务状态并立即返回;Banner 不预加载,只在业务请求展示时创建并加载;支持 Banner 且广告位启用、页面允许展示时,在页面首帧前先预留广告区域并完成 UI 布局,不等广告加载或展示。每个广告位独立维护加载失败计数、retry deadline 和至多一个重试 timer,但使用相同分类、退避、暂停和恢复规则。开始任何设计、实施或审查前,必须先读取唯一细则合同 AppLovin MAX 接入合同,并以其中的状态、时序、失败和合规规则为准。
- ThreeJS Web、浏览器预览和小游戏不直接调用 MAX,也不加载原生广告 SDK;广告能力在这些运行目标上必须是明确的
unsupported/no-op,调用后立即返回并继续游戏。 - iOS 与 Android 只使用 AppLovin 官方
cordova-plugin-applovin-max。实施前必须按官方 Cordova 集成文档和官方仓库核对插件版本、Capacitor Cordova 兼容层、Android Gradle 与 iOS 包管理器;不兼容时阻断并报告,不回退到社区插件、自建 Capacitor 原生插件或业务代码直连 MAX SDK。 - 本 Skill 不替项目自动配置 MAX 控制台、广告网络账号、商店元数据或发布渠道。SDK key 与 ad unit ID 按环境从受控构建配置注入官方插件适配层,不手写进业务源码、示例、日志或提交记录;广告网络账号凭证与 Ad Review key 不得进入 Web 代码或公开产物。
- 广告只在自然中断点尝试展示;调用方永不等待广告加载、网络请求或展示完成。不可展示时必须按广告位当前状态立即返回结果,不得阻塞场景切换、输入、主循环或结算流程。后台加载、加载失败和重试保持静默,不弹 Toast。
- 视频广告位在用户触发展示但当前不可用,或官方插件接受展示后回调
displayFailed时,通过统一 UI 层弹出一次“视频广告暂不可用,请稍后再试”Toast;不得由插件适配层直接操作 ThreeJS UI,也不得因重复回调重复提示。 - 必须在 MAX 初始化前明确关闭内建 Terms and Privacy Policy Flow,并核对最终 Android/iOS 构建配置不会重新启用;不能仅删除弹窗调用或未经核对就假定默认关闭。官方 Cordova 接口未暴露该流程开关时,通过官方支持的宿主配置取消其 opt-in 启用项,不编造 JS 方法。关闭后仍正常调用 MAX initialize,以真实初始化完成回调确认成功,不以隐私弹窗、CMP、ATT 或 AppsFlyer 的完成作为初始化/重试前置;SDK/所选 CMP 的实际能力限制按合同核对,不能绕过官方必需条件。隐私状态仅控制广告加载与展示,其未完成、失败或用户拒绝不得覆盖已经确认的 MAX 初始化成功;独立隐私方案和真实授权状态仍单独配置。关闭方式与最终配置核对见接入合同。
- MAX 与项目其他已采用 SDK 的初始化、完成回调、幂等和初始化重试统一写在
src/platform/initialize-sdks.ts,遵循SDK 单文件独立初始化。MAX 不等待其他 SDK,也不在成功回调里启动其他 SDK;广告服务只消费其初始化结果并管理广告位,不再持有第二套初始化请求或重试状态。 - 每次创建新的 MAX SDK 实例时,在该实例首次实际 initialize 前手动调用官方
AppLovinMAX.setHasUserConsent(false),不能只写本地变量或依赖默认值。该值是 SDK 隐私配置,不是广告开关;不得因false把 privacy gate 置为 pending/blocked、跳过插页/激励预加载、阻止 Banner 按需加载、暂停加载重试或拒绝展示。SDK 已就绪且其他实际条件满足时照常请求广告,由 SDK/adapter 按该配置处理;不承诺填充,也不把值改成 true 来绕过真实失败。设置 false 与关闭内建流程分别执行,不能互相代替。 - 本 Skill 中有效初始化配置必须包含已核实的独立时序资格:“隐私未决仍初始化”和相关重试规则仅适用于官方支持的 SDK/CMP 组合。官方要求自有 CMP 前置而当前组合不满足独立时序时,MAX 返回配置阻断,不调用 initialize、不安排自动重试,也不等待 CMP 或 AppsFlyer;记录具体限制后按当前任务解决,其他 SDK 与游戏继续。该配置阻断不能从用户拒绝同意或 ATT 状态本身推断。
- 项目启用 AppsFlyer 时,其初始化与实际启动使用统一文件中的独立任务;不能挂在 MAX 初始化、内建隐私流程或广告加载回调下,MAX 失败或不回调不影响 AppsFlyer 启动,AppsFlyer 失败或不回调也不阻止 MAX。该规则不要求未采用 AppsFlyer 的项目额外安装 SDK。
- Banner 不参与初始化预加载;首次请求展示时才创建原生视图并加载,调用立即返回。收到 loaded 且布局安全、业务仍请求可见时显示;创建或加载失败均保持隐藏并按同一独立退避持续重试;离开展示场景清除可见请求并取消重试,旧回调不得恢复创建或显示。不弹 Toast、不占用错误高度、不等待加载。