不开 Xcode 也能拿到 App Store 的 IPA 包:ipatool 命令行下载完整指南
不开 Xcode 也能拿到 App Store 的 IPA 包:ipatool 命令行下载完整指南
【免费下载链接】ipatoolCommand-line tool that allows you to search for iOS, iPadOS, tvOS, watchOS, visionOS, and macOS apps on the App Store, and download .ipa or macOS .pkg app packages.项目地址: https://gitcode.com/GitHub_Trending/ip/ipatool
ipatool 是一个用 Go 编写的命令行工具,能在终端里直接检索并下载 App Store(iOS、iPadOS、tvOS、visionOS、macOS)中的应用,产出.ipa或 macOS.pkg安装包。它面向做抓包分析、安装包备份与 CI 集成、不想在 iTunes 或 Xcode 里点选的操作场景。读完本文,可以只凭终端完成「登录 → 搜索 → 下载 → 历史版本归档」这条链路,并把其中每一步接进脚本与定时任务。
拿到第一个 IPA 的最短路径:从安装到下载
安装有三条路线,按环境任选其一:
- macOS:
brew install ipatool - 全平台:从项目发布页下载对应系统的预编译二进制,放入 PATH
- 有 Go 环境的机器:克隆源码后本地构建
git clone https://gitcode.com/GitHub_Trending/ip/ipatool cd ipatool go build -o ipatool装好后用ipatool --help确认能看到 auth、search、download、purchase、list-versions 等子命令即可。
接下来是一条连贯的最短命令序列,中间没有多余的准备步骤:
ipatool auth login -e you@example.com ipatool search "微信" -l 5 ipatool download -i 414478124 -o ~/Downloads/wechat.ipa逐条说明:
- 问题:所有涉及 App Store 数据的命令都需要 Apple ID 身份,得先认证。命令:
ipatool auth login -e you@example.com。预期结果:终端依次提示输入密码(不回显);首次登录可能要花几分钟,耐心等完即可。 - 问题:不知道目标应用的标识,得先搜。命令:
ipatool search "微信" -l 5。预期结果:返回至多 5 条候选,每条带数字 App ID、名称、当前版本、Bundle Identifier。 - 问题:把包落到本地。命令:
ipatool download -i 414478124 -o ~/Downloads/wechat.ipa。预期结果:交互模式下有下载进度条,结束时打印落盘路径,确认文件存在即链路打通。
Apple ID 登录时 2FA 怎么过:账号开启两步验证时,密码之后终端会停在enter 2FA code:提示上。在任意已信任的 iPhone / iPad 上打开「设置 → Apple ID → 密码与安全性 → 获取验证码」,把 6 位数字填进终端:
无法交互的环境(CI、远程会话)不能依赖提示,直接用参数把验证码带入:
ipatool auth login -e you@example.com --auth-code 123456登录成功后,凭据写入系统钥匙串(macOS Keychain、Linux Secret Service,或降级为本地文件),服务名是ipatool-auth.service,后续命令自动复用;ipatool auth info查看当前账号,ipatool auth revoke删除凭据。凭据的存取抽象集中在 pkg/keychain/ 目录;若需要排查登录与 SAP 签名协议,入口文件是 appstore_login.go。
凭据存的是加密记录而非明文,但在共享机器上仍建议用专用或临时 Apple ID,避免主账号记录留在公共环境里。
搜索结果里的两个标识:App ID 与 Bundle Identifier 怎么用
每条搜索结果给出两个指向同一应用的标识:数字 App ID(配合-i)与字符串 Bundle Identifier(配合-b)。download、purchase、list-versions、get-version-metadata都接受二者任选其一;同时给出时优先按 Bundle Identifier 解析,解析不命中再回退到数字 ID——这对已下架应用很关键,后文「常见坑」里有具体说明。
搜索本身的筛选参数只有两个:
-l, --limit:返回条数,默认 5,visionOS 平台最多 12 条--platform:iphone(iOS)、ipad(iPadOS)、appletv(tvOS)、visionos、macos;不指定时覆盖 iPhone 与 iPad 两个实体。ios、tvos、mac这类别名也会被接受
同名应用同时有 iPhone 版和 Apple TV 版时,加--platform appletv把范围收窄:
ipatool search "微信" -l 10 --platform appletv版本与授权管理:历史版本下载和授权补齐
想拿历史版本,分两步:先枚举可下载的版本标识,再在下载时指定:
ipatool list-versions -i 414478124 ipatool download -i 414478124 --external-version-id <external version id> -o old.ipalist-versions会输出一组 external version identifier(字段名externalVersionIdentifiers);--external-version-id不传时默认取最新版。想核对某个版本的发布时间和更新说明,用get-version-metadata,此命令要求必须给出--external-version-id:
ipatool get-version-metadata -i 414478124 --external-version-id <external version id>输出包含 displayVersion(对外版本号)与 releaseDate(发布时间)。
授权是另一件独立的事:App Store 要求任何应用(包括免费应用)在下载前都有该账号名下的有效授权记录。账号下缺授权时,download会直接报 license 错误,两种补法:
ipatool download -i 414478124 -o wechat.ipa --purchase--purchase会在遇到授权错误时自动补一次授权并重试;也可以单独先把授权拿到手,再重新下载:
ipatool purchase -i 414478124已持有授权的应用再执行 purchase 会被识别为「已拥有」,不算错误。
需要提醒的是:下载得到的.ipa是加密包,必须走对应的授权安装渠道(企业签名、开发者工具等)才能装机,文件落盘不等于任意设备可直接安装。
交给脚本:JSON 输出、非交互模式与最小监控示例 ⚙️
自动化依赖两个全局开关:
--format json:几乎所有命令的输出都切换为结构化 JSON(默认是面向终端的 text 排版),可以直接喂给jq。--non-interactive:工具不再等待任何输入,放进 CI 或 crontab 是安全的。注意两个连带约束:该模式下登录必须显式提供-e与-p(没有提示可答);若凭据落在文件型钥匙串,还必须通过--keychain-passphrase提供解锁口令,否则直接报错。交互式模式下这两个信息都可以靠终端提示补全,这是两种模式唯一的实质差别。
批量下载的例子:从搜索结果抽出 App ID 列表,逐个下载归档:
ipatool search "微信" --format json --non-interactive | jq -r '.apps[].id' | \ while read -r id; do ipatool download -i "$id" -o "archive/$id.ipa" \ --non-interactive --keychain-passphrase "$IPATOOL_PASS" done最小可用的定时监控脚本:每天检查一次搜索结果里的版本号,变化时归档一份安装包:
ver=$(ipatool search "微信" -l 1 --format json --non-interactive \ --keychain-passphrase "$IPATOOL_PASS" | jq -r '.apps[0].version') [ "$ver" = "$(cat last-version.txt)" ] && exit 0 ipatool download -i 414478124 -o "wechat-$ver.ipa" \ --non-interactive --keychain-passphrase "$IPATOOL_PASS" echo "$ver" > last-version.txt交给 crontab 即可:
0 3 * * * /path/to/watch-wechat.sh各子命令的常用参数速查如下(完整 flag 定义见 cmd/ 目录,全局参数--verbose可打开详细日志用于排障):
| 命令 | 用途 | 常用参数 |
|---|---|---|
auth login | Apple ID 登录 | -e邮箱、-p密码、--auth-code验证码 |
auth info/auth revoke | 查看账号 / 清除凭据 | — |
search <关键词> | 搜索应用 | -l条数(默认 5)、--platform |
purchase | 获取授权 | -i/-b、--platform |
list-purchases | 列出已购应用 | -l每页条数(默认 10,上限 100)、-p页码(默认 1) |
list-versions | 列出可下载版本 | -i/-b、--platform |
get-version-metadata | 查询版本详情 | --external-version-id(必填)、-i/-b |
download | 下载安装包 | -i/-b、-o、--external-version-id、--purchase |
顺带一提:ipatool 还提供ipatool mcp子命令,把搜索、下载等能力以 stdio 方式暴露给 MCP 客户端;该模式固定运行在非交互态且不提供认证工具,需先在终端完成auth login。
常见坑:现象 - 原因 - 处理
| 现象 | 原因 | 处理 |
|---|---|---|
登录停在enter 2FA code:,非交互模式下则直接报 2FA 错误 | 账号开启两步验证,新设备登录必须验证 | 在已信任设备取 6 位验证码填入终端;脚本中改用--auth-code直接带入 |
| 下载中途报 license / 授权错误 | 该应用在当前账号下没有有效授权记录(免费应用同样需要) | 追加--purchase自动补授权并重试;或先单独执行ipatool purchase |
输出接jq解析失败、进度条与提示符混在管道里 | 默认是交互式 text 模式,stdout 不保证是纯结构 | 统一加--format json --non-interactive |
| 非交互模式报钥匙串口令错误 | 文件型钥匙串需要解锁口令,非交互模式无法弹提示 | 通过--keychain-passphrase传入口令 |
用-b查不到应用(多为已下架应用) | 按 Bundle Identifier 的查询不返回已下架应用,但数字 ID 仍可用 | 换用-i指定数字 App ID 下载 |
收尾
一句话总结:ipatool 把「从 App Store 拿到安装包」这件事压缩成了登录、搜索、下载、版本管理四条命令行能力,再加上 JSON 与非交互模式,整条链路随时可以被脚本接管。留一个开放问题给想继续深入的人:已下架应用依然能用 App ID 下载,但搜索接口已经查不到它们——如果要把这套流程用于长期归档,如何维护一份「搜索之外、靠人工登记 ID 保底」的应用清单,值得在设计监控脚本前先想清楚。
【免费下载链接】ipatoolCommand-line tool that allows you to search for iOS, iPadOS, tvOS, watchOS, visionOS, and macOS apps on the App Store, and download .ipa or macOS .pkg app packages.项目地址: https://gitcode.com/GitHub_Trending/ip/ipatool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考