用途:这是广告与结算接缝之上的策略层,规定激励观看授予什么、插屏何时与多久触发、权益如何门控二者,以及启动时的初始化顺序。前提是接缝已存在——接口声明、按 flavor 覆写、把 SDK 类型挡在功能代码之外属于 service-boundary-and-native。模型为免费、主动选择优先:价值换取用户自愿付出的注意力,一次非消耗型购买可移除该交换。
主要规则:所有广告与商店调用都走注入接口(AdsService、BillingService),功能代码不出现 SDK 类型。激励观看须由明确的“观看以获取”点击触发,只授予一个具体权益,且仅在真实奖励结果(密封类型 Rewarded / Dismissed / NoFill,穷尽分支)下发放;Dismissed 与 NoFill 不授予且不改状态。赚取循环按注入的 Clock 按自然日设上限,上限放在策略层。不得发布可能死路的赚取控件:预加载、以流暴露可用性,仅在广告确实已加载时显示控件,用户所需内容在未观看时仍可达。插屏只在自然断点触发,由服务持有双重上限(每 N 次完成至多一次、距上次至少 M 秒),由 maybeShowInterstitial() 计数与计时并返回是否展示。主要工作界面不放横幅。一次非消耗型解锁加可见的 Restore,每次启动静默复核权益;首次发布时该购买须与应用版本同一提交上架。单一派生 isEntitled provider 作为唯一门控。先恢复权益再初始化广告 SDK;商店或网络失败按未授权处理并初始化,同时本地缓存上次已知权益以保证离线启动正确。购买须经唯一写入路径提交后 UI 才反应。不得既付费买断又展示广告。广告位标识属于配置,示例 id 不得进发布包,可用 scripts/check-release-ad-ids.sh 校验。
用法要点:策略层依赖接口与权益门控而非 SDK;赚取控件绑定 rewardedAvailability;启动顺序为先 restore,未授权再 init 与 preloadRewarded。用测试断言已授权用户下假广告服务的 initCount == 0。
适用场景:采用广告与应用内购买变现的 Flutter 应用,需满足商店审核与避免“像广告软件”的观感。
限制与说明:文中对具体价格、收费标准、平台范围、实际收益效果未提供;相关实现细节由 service-boundary-and-native、app-startup-and-bootstrap、state-management-riverpod、persistence-drift、error-handling-typed-results、release-and-store-shipping 等技能承担。