现在用 AI 生码工具写一个 iOS App,你可以不交 Apple Developer Program 的 $99/年,就把这个 App 在浏览器里设计完、在云端 Mac 上编译完、再传到自己手上的真机里点一遍。免费路径比想象中走得远,但有一条很清晰的天花板。最坏的踩坑时机,是上线前一天才发现自己撞上了它——一笔 $99 加一轮审核排期砸下来,整个发布节奏会塌掉一整天。这篇把那条线画清楚:免费路径到底覆盖到哪、哪四件事一发生就该立刻交钱、还在免费阶段时哪四件事先做完最划算。
很多副业开发者第一年都在纠结这 $99 该不该交、什么时候交。AI 生码工具(Bolt、Lovable、a0.dev、Rork 等,以及更底层的 Expo / EAS)又把免费路径拉得更长了:你可以一直在浏览器里改、在云端 Mac 编译、在自己手机上预览,根本碰不到「签名」这两个字。
但「不用签名也能跑真机」≠「不用签名也能上线」。这中间隔着 Apple 真正在收钱的那一道闸——TestFlight、生产环境推送、真机 StoreKit 沙盒、HealthKit 这类签名授权能力。撞上这道闸的最差时机是上线前一天:这时候交 $99 不仅多花钱,关键是审核来回还要烧几天,把整个上线节奏拖垮。
下面这条线,是我看过的最清晰的一种切法。
免费路径到底能走多远
把现代 AI 生码工具的能力和 Expo 这一类 RN 工具链合起来看,免费路径其实已经足够跑出一个真实的开发闭环——全程不签名、不入会:
在浏览器里(Chrome / Safari)直接画稿、生成、编辑 用云端 Mac 编译,串流一个 60fps 的实时模拟器,带真实触控输入 通过工具的伴侣 App(Expo Go、各家 dev client 这一类预览容器)把构建产物推到你自己手上的真机,直接点 拿一个分享链接,让朋友在他自己的设备上预览同一个版本
走到这一步,UI 看上去对不对、导航有没有死胡同、列表表单是不是按预期渲染——这些「外观和直接手感」的事都验得到。
一个有意思的经验数据是:AI 生成的 App,大约 70% 值得修的缺陷,都能在免费路径上暴露出来。导航死胡同、空数据下崩溃、状态不持久——这些反复出现的模式,在实时模拟器里就能筛掉一大批,根本用不着先把构建签出来再去看。
换句话说,如果你还在想法验证阶段,或者还在反复打磨 UI 触感,没必要急着交 $99。在免费路径上多便宜地迭代几轮,反而离一个真正能见人的 App 更近。
真正卡住你的是这些
伴侣 App 把构建推到你手机上,本质是「在一个预览容器里跑你的代码」,不是 Apple 正式的签名分发链路。所以只要是需要操作系统下发「生产环境授权」的能力,在免费路径上跑出来的都不是真东西。
下面这张清单,就是要 $99 才能解锁的具体场景:
最容易忽视的一点是:跟收入最直接挂钩的功能,全在免费路径外面。AdMob 用测试广告可以验一部分,但 StoreKit 的订阅和一次性内购,本质上要在一个真签名的构建里跑沙盒,而沙盒要走 App Store Connect——App Store Connect 又必须先入会。推送也一样:伴侣 App 能让你看到本地通知是什么样,但要从你自己的服务器打一条生产 APNs 出去,前提是这是个签了名的构建。订阅服务端校验那篇里讲过,真正决定收入对账的那些链路,都不可能在免费路径上完成。
什么时候是真的该交了:四个触发点
凭感觉决定「该不该交」,通常不是交太早就是交太晚。交太早,会员费白挂一年;交太晚,审核排期直接砸在上线那一天,把势头干掉。
我现在的做法是,只要下面任意一条第一次发生,就当作触发器,立刻去交:
你的核心收入路径是推送、内购或订阅——测试广告永远验不全这套链路,而且你从设计阶段就需要这个账号,否则后期一堆事推不动。 你想把这个 App 交给除自己以外的人测——伴侣 App 的分享链接能照顾到的人非常有限;一旦你要做外部测试者扩面,TestFlight 外部分发就必须开,而它必须入会。 你需要 App Store 专属能力跑出与上架版本一致的效果——App Clips、Widgets、Live Activities,以及前面提到的 HealthKit / App Groups 之类签名授权能力,只有在一个签了名的构建里,才会呈现出和上架版本一致的样子。 离计划上线日还剩 1-2 周——审核来回需要缓冲时间,提前交钱把审核排期清出来,比等到上线日当天再发现自己还没入会要从容得多。
反过来,只要这四条都没碰到,你还在「这玩意儿到底是不是个东西」「界面手感够不够顺」这种阶段,就完全没有必要花这 $99。免费路径多换几轮迭代,本身就在帮你逼近一个值得发布的版本。
在还能省钱的时候,把这四件事先做完
签出第一个生产构建的那一刻,会突然冒出一堆「啊我应该早点弄好」的小事。这四件事如果你还在免费路径就做完,第一轮审核周期不会被配置错误吃掉。
1. 存储与多分辨率资源切分
实时模拟器最容易掩盖的,就是「真机第一次启动的重量」。图片密集型 App 尤其要在还没签名的时候把多分辨率切分和懒加载理清楚。我自己以前发壁纸 App,有一版没处理好分辨率切分,结果在低分辨率设备上资源直接掉了——这种问题就该在签名之前杀掉,而不是在第一次提审时才发现。
2. 权限提示顺序
权限弹窗——ATT(App Tracking Transparency)、通知、相册——出现的顺序和时机,直接决定用户给不给。一个比较稳的基线是:首启动不要把这几个全堆上去,每个权限都在它真正要被功能用到之前再请求,然后把这个顺序在还能免费迭代的时候直接写进代码。
3. 崩溃上报和事件埋点基线
如果你第一次见到崩溃,是在签名构建里,那定位起来会很慢——因为你分不清是新代码引入的,还是签名/打包流程引入的,信号是混在一起的。所以还在免费阶段就先把崩溃上报和事件埋点的最小骨架放进去,签名之后验证速度会快一大截。
下面是一个 Expo 的 app.json 模板,把交钱前就该锁死的 ID 和权限文案先固定下来:
{"expo": {"name": "MyApp","slug": "my-app","ios": {"bundleIdentifier": "com.yourcompany.yourapp","buildNumber": "1","infoPlist": {"NSUserTrackingUsageDescription": "用于向你展示更相关的广告。","NSPhotoLibraryAddUsageDescription": "用于把壁纸保存到你的相册。","ITSAppUsesNonExemptEncryption": false } },"android": {"package": "com.yourcompany.yourapp","versionCode": 1 } }}bundleIdentifier 和 package 一定要在免费阶段就敲定到生产值——后期再改,等于把所有分发链路重做一遍。ITSAppUsesNonExemptEncryption 先声明为 false,可以避免提审环节卡在出口加密问询上。
4. 签名前自我审计
最经典的拒审原因,是 Info.plist 里缺权限文案、或者版本号对不上。还在免费阶段就在签名构建前挂一个静态检查,能少吃好几次「为了一个配置错误浪费一轮提审」的亏。下面这个最小版本用 Node 就能写:
// presubmit-audit.js —— 签名构建之前的最小校验const fs = require("fs");const cfg = JSON.parse(fs.readFileSync("app.json", "utf8")).expo;// 必须存在的权限说明文案,根据自己 App 用到的能力扩展const required = ["NSUserTrackingUsageDescription","NSPhotoLibraryAddUsageDescription",];const info = cfg.ios?.infoPlist ?? {};const missing = required.filter((k) => !info[k]);if (missing.length > 0) {console.error("缺少权限说明文案:", missing.join(", ")); process.exit(1);}// bundleIdentifier 必须是反向域名,不能停在占位状态if (!cfg.ios?.bundleIdentifier?.includes(".")) {console.error("bundleIdentifier 还没定到生产值"); process.exit(1);}console.log("自我审计通过");脚本只有几十行,但它就是「不让你为一个空字段烧掉一次审核」的保险。我同时跑多个 App,每次提审都会在同样的几个地方栽跟头,所以干脆把这种小校验冻进签名构建前的检查步骤里。
云模拟器永远复现不了的事
要把免费路径用到极致,你得明确知道它的硬边界。云端实时模拟器再快再方便,有几件事它从原理上就复现不了:
真机热降频带来的帧抖(长列表滚动、视频播放时那种突然的卡顿) 内存压力下系统强杀 App(iOS 的 jetsam) 真传感器的手感和触觉反馈 真实的弱信号和离线切换抖动
哪怕你在免费路径上把 UI 打磨到完美,这几样只能上真机才看得到(也就是用伴侣 App 把构建推到自己手机上看)。我做壁纸 App 时,内存压力下 App 被系统强杀这种事,从来都是推到真机之后才暴露的。所以分工是清楚的:原始行为在免费路径上铺平,真机上只验那些只能在真机上验的东西。
把免费路径和付费链路桥接好的工作流
把上面这些拼起来,顺序就是:
想法验证和 UI 打磨,全在免费路径上做完 还没签名时,把上面四项准备清单收掉 一旦撞到那四个触发点之一,立刻交 $99,不要拖
这样做的好处是,交完钱之后的时间,完整地用于「验证」这件事,而不是「补配置」:
云端模拟器验证原始行为 签名构建验证生产授权能力和真实购买流程 TestFlight把它送到别人的设备上
三层职责干净分开,任何一层出问题都能快速定位。再叠加 App Store 元数据代码化那一套发布流程,从「写完」到「提交」的摩擦就压到最小。
免费路径存在的意义,是擦掉「开始动手之前」的摩擦,不是替代「真正要拿钱和分发」的那条生产线。从一开始就守住这条线,你才有机会自己挑哪一天交这 $99——而不是被上线日期推着交。
最实用的一步,就是现在去翻出一台备用真机,把它连到伴侣 App,然后对你当前的 app.json 跑一次上面那个自我审计脚本。
独立开发者怎么决定,中国出海开发者还要额外算什么
对副业 / vibe coder 开发者来说,这 $99 的纠结点其实不是「贵不贵」,而是「这个 App 值不值得我开始把它当作一件正经的事」。下面是几条比较稳的判断方式:
想法验证期不要交。还在试这玩意儿是不是个东西的阶段,你需要的是更多次便宜的迭代,而不是把成本沉到 Apple 那一边。 一旦决定要把它给除自己以外的人看,就立刻交。免费路径上的分享链接能照顾的范围有限,迟早要走 TestFlight,而 TestFlight 不入会用不了。 算好审核排期的缓冲。Apple 官方数据上九成应用在 48 小时内能拿到首次审核结果,但被打回再交、或材料复杂的情况下,实际来回常要 3-7 天;首次入会和绑定支付方式也有 1-2 天延迟。往回倒推上线日,至少预留两周。 副业开发者的另一个隐藏成本是「续费日」。$99 是按年付,如果你的 App 上线后没产生稳定收入、又懒得撤下来,第二年这笔钱该不该续,值得提前算清楚。
对中国大陆出海开发者来说,在「该不该交」之外,还有几件特别要提前算:
支付方式和币种。Apple Developer Program 按 $99 美元结算,绑卡那一步要用支持外币支付的卡;国内双币信用卡或部分虚拟卡可以走通,但交钱之前要确认这张卡能跑外币订阅扣款。 个人 vs 公司账号的路线选择。个人账号注册流程比较直接,需要本人 Apple ID + 双因素认证 + 个人税务信息;公司账号(Organization)需要 D-U-N-S 编码(邓白氏编码,在 Apple 后台免费申请,通常 1-2 周下来),还要营业执照、对公邮箱,审核更严。如果你想长期做副业、未来可能接广告分成,个人账号通常就够用,不必非要走公司账号——除非你打算用 App Groups 跨多个 App,或者明确做 ToB 业务。 税务表单 W-8BEN / W-8BEN-E。想在 App Store Connect 里拿到收益分成,要在税务信息里声明自己不是美国税收居民:个人填 W-8BEN,公司主体填 W-8BEN-E(两张表别填错)。中美有税收协定,这张表填好(主张协定优惠)能避免被按默认预扣率扣过高的税款。这件事跟 $99 是两条线,但通常一起处理掉。 审核反馈的语言和节奏。Apple 审核反馈是英文,中国时区基本要等到夜里才有动静;在自己的发布节奏里要给跨时区沟通额外留半天。 隐私合规叠加。国内独立开发者上 App Store 国区,除了 Apple 自己的隐私清单(privacy nutrition label)和 ATT,还要额外考虑国内的隐私政策和实名要求;这些不影响 $99 决策本身,但会决定你提审材料里要准备多少东西。
把这两层(美国体系的 $99 和审核机制 + 中国出海的额外步骤)合在一起看,「什么时候交 $99」这件事的答案,通常比你想象中早 1-2 周——因为你要给跨时区、跨货币、跨身份认证留足缓冲。
改写自 Rork Lab《How far Rork Companion's free device testing goes — and when to pay the $99 Apple Developer Program》。本文把原文中绑定 Rork Companion 的具体产品语境,抽象为通用 AI 生码工具 / Expo / EAS 等免费真机方案的边界讨论;删除了原文的 a16z 融资数据、月访问量等营销数字与会员订阅推介;补充了独立开发者「不要在想法验证期就交」「续费日成本」等落地角度,以及中国大陆出海开发者关于 D-U-N-S、W-8BEN / W-8BEN-E、支付方式、个人 vs 公司账号选择、审核排期缓冲等额外步骤。
夜雨聆风