Back to Blog
·1 min read

记一笔本地内购配置漂移的坑,教训比事故本身值钱

记一笔本地内购配置漂移的坑,教训比事故本身值钱。 Xcode 本地测试用的 StoreKit 配置文件(.storekit 那个 JSON)和 App Store Connect

记一笔本地内购配置漂移的坑,教训比事故本身值钱。

Xcode 本地测试用的 StoreKit 配置文件(.storekit 那个 JSON)和 App Store Connect 里登记的内购目录,可以各自都"对"而对不上:文件里躺着一个商品 id,线上目录里早就没有它了。本地测试、截图、价格显示全绿——因为测试读的是文件;审核员和真实用户读的是目录。两边都被当成真相,又没有任何一步把两边对着比,这种漂移就能一直安静地活着。

为什么不可见:本地测试通过只证明文件内部自洽,不证明文件和世界一致。.storekit 是生成一次就当静态资源用的东西,目录后来改名、下架、新增,它不会跟着动;反过来手改过文件,目录也不知道。每一侧单独验证都能过,这恰恰是这类 bug 的藏身处。

修复是有顺序的,顺序本身就是修复的一半: 1. 先定真相源。审核和真实交易都发生在目录那边,默认目录是对的。 2. 从目录重新生成文件,而不是手工把文件改到"看起来一致"。手改等于宣布文件才是真相,下次漂移照旧;只有确认目录本身错了,才反向去修目录。 3. 只往一个方向再生。两边各改一点去"合并",是把一次漂移变成两次。 4. 把比对机械化:一条检查,把文件里的 productId 和目录做全量 diff,任一侧多出的 id 都判失败。修法不沉淀成检查,就只是这次填了坑,不是关了门。

一分钟自检:把 .storekit 当 JSON 数一遍所有 productID(一个 grep 的事),再打开 App Store Connect 的内购列表数一遍,两个方向都要查。文件有、目录没有——本地能买、审核买不到;目录有、文件没有——真实价格你从来没测过。对不上就是漂移,别等它变成拒审才信。

背后更一般的规则:生成的测试夹具和它描述的外部契约是两份文件,可以各自合法地活很久。单一真相源不是"存在一个权威文件",而是"另一份永远从它重新生成,并且有东西盯着两个方向"。

#build-log

Written by

Peter Zhang

Building local-first Mac & iOS productivity apps at Obelisk Club.