我做 AIR 项目有几年了,一开始也以为 iOS 这条线非得配台 Mac 不可。真折腾下来才发现,AIR 大概是所有跨平台方案里最特殊的一个——HARMAN 维护的 AIR SDK 自带的 ADT 命令行工具,在 Windows 上就能把 IPA 打出来,AOT 编译、代码签名、封包全在本机完成,Xcode 一次都不用开。
真正卡住我的只有一件事:ADT 要一张含私钥的
.p12 和一份
.mobileprovision,而这两样按官方路径得在 Mac 上用「钥匙串访问」生成 CSR、再去开发者网站换。我在 Windows 上试过用 OpenSSL 手搓那一套,能成,但参数一错就得从头来。后来改用开心上架(AppUploader)在 Windows 上直接签发,这一步才算彻底不挡路了。
下面是我现在实际在用的流程。
| 环节 | 我实际怎么做的 |
|---|---|
| 注册 Bundle ID、签发证书、生成描述文件 | Windows 上做完,不碰 Mac |
| 编译签名、打包成 IPA | ADT 在 Windows 上直接出包 |
| 提交 App Store | Windows 上传,不用 Transporter |
| 装到 iPhone 测试 | 扫码注册 UDID,再扫码装 |
顺带说一句,这工具本身不是只能在 Windows 上跑。网页版任何系统的浏览器都能打开,桌面客户端也有 macOS 版。我同事用 Mac,他一样拿它签证书——省掉的是钥匙串和 Transporter 那套操作,不是省一台机器。
AIR 的应用标识写在描述文件
*-app.xml 的
<id> 节点里:
1<id>com.yourcompany.appname</id>
我建议先把这个值想清楚再去注册,因为 Apple 那边的 Bundle ID 创建之后是改不了的。我第一次图省事随手填了个名字,后来想改,只能重新建一个,原来那个还删不掉(有依赖的时候 Apple 不让删)。
注册的地方在开心上架的「Bundle ID」页面,点「新建 Bundle ID」,Identifier 填反向域名,只能用字母、数字、连字符和英文句点。要是应用会用到推送、App Groups 这些能力,顺手在这个 Bundle ID 的「权限」页面勾上再保存。

ADT 要的是 PKCS#12 格式的密钥库,也就是含私钥的
.p12。
在「证书」页面点「新建证书」,上架的话类型选发布签名证书,只想先真机跑起来看看就选开发签名证书。绑定标识选刚才那个 Bundle ID,填个好认的名称和邮箱,然后设置
.p12 保护密码。
这个密码很关键:它就是后面 ADT 命令里
-storepass 要填的值,而且服务器不保存它,忘了就只能吊销证书重签一张。我现在的习惯是直接丢进密码管理器。
还有个选项叫「使用开心上架服务同步证书」,勾上之后换台电脑能重新下载同一张证书。我当初没勾,后来换机器时发现
.p12 只在旧电脑上,白折腾半天。同类型证书 Apple 一般只给 3 个名额,别乱签着玩。
提交之后 Apple 立刻签发,在列表里下载
.p12 就行。私钥是在本机生成后直接封进去的,不用再拿 OpenSSL 转一道。
「描述文件」页面点「新建描述文件」。上架用 App Store 类型,发给测试同事用 Ad Hoc,自己真机调试用开发类型。关联的 Bundle ID 选第一步那个,证书选第二步那张。
Ad Hoc 和开发类型还要勾测试设备。没设备的话直接点「注册设备」,让对方用手机扫个码就把 UDID 报上来了,不用连数据线,也不用装 iTunes。
提交后下载
.mobileprovision,我一般和
.p12 一起放在工程下的
cert/ 目录里。

AIR SDK 解压后
bin/adt.bat 就是打包工具,本机要有 JRE。上架包的命令是这样:
1adt -package -target ipa-app-store ^2 -provisioning-profile cert\AppStore.mobileprovision ^3 -storetype pkcs12 -keystore cert\dist.p12 -storepass 你的p12密码 ^4 MyApp.ipa MyApp-app.xml MyApp.swf assets
-target 这个参数决定了包的用途,我常用的几个:
ipa-app-store——提交 App Store 用,配 App Store 类型描述文件;ipa-ad-hoc——发给已注册 UDID 的设备,配 Ad Hoc 描述文件;ipa-test /
ipa-debug——快速出包做真机调试,配开发类型描述文件;ipa-test-interpreter /
ipa-debug-interpreter——解释器模式,打包快但跑得慢,只适合开发期反复验证。有个地方要提醒一下:
ipa-test 和
ipa-debug 打出来的包是不能上架的,带调试信息、签名类型也不对。我早期传上去被拒过一次才反应过来。
另外
ipa-app-store 走的是完整 AOT 编译,我这台机器上中等规模的工程要跑十几分钟,第一次遇到别以为卡死了。HARMAN 的 AIR SDK 分不同授权层级,免费层对启动画面之类有额外限制,具体看官方发行说明。
打完包我一般先在开心上架的「文件&提交」页面把 IPA 打开看一眼——Bundle ID 对不对、用的是不是 App Store 类型描述文件、证书还有多久到期,这几项确认了再点「提交 App Store」,上传日志是实时滚的,出问题直接写在里面。
要是想接进构建脚本,命令行更方便:
1appuploader-cli upload -f MyApp.ipa -u dev@example.com -p abcd-efgh-ijkl-mnop
-p 填的是 Apple 那边生成的 App 专用密码(
xxxx-xxxx-xxxx-xxxx 那种格式),不是 Apple ID 的登录密码——这点我一开始搞混过。团队用的话更推荐 App Store Connect API 密钥,它属于团队不属于个人,人员变动了也不影响:
1appuploader-cli upload -f MyApp.ipa --api-key <KeyID> --api-issuer <IssuerID> --private-key Auth_Key.p8
密钥这条路只支持
.ipa,而且要求这个 App 已经在 App Store Connect 里建好了。
上架前我习惯先出个
ipa-ad-hoc 包发给测试。流程就是在「设备」页面点「注册设备」,让人扫码上报 UDID(一年 100 台名额,免费账号只有 3 台),然后回描述文件那边点「重建」把新设备包进去——不用重走一遍新建流程,重建会自动用当前有效的证书和设备重新生成。
拿新描述文件重新
adt -package -target ipa-ad-hoc 打一次,再在「文件&提交」里生成二维码,测试的人扫一下就装上了,不用连电脑。
AIR 这条路真正的好处是编译签名这一步就在本机,不用等云端排队,也不用求人借 Mac。我现在整条链路从改代码到提交 App Store 都在同一台 Windows 上完成,中间不切环境。
证书和描述文件那部分我用的是开心上架,网页版直接能开,不装东西也行。如果你也在 Windows 上做 AIR,卡在
.p12 这一步的话可以试试。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70051062/viewspace-3180977/ ,如需转载,请注明出处,否则将追究法律责任。