IPA文件中有哪些文件需要签名?是否需要对文件夹结构签名?
iOS IPA 签名底层逻辑答疑
一、你提到的二进制类型补充
除了你列出的三类二进制外,还有两类常见的需签名二进制实体:
- App 内置的命令行工具/辅助独立二进制,比如很多应用内置的ffmpeg、自定义调试工具二进制
- 嵌入的App Clips(轻应用)、Watch 应用及其对应的Extension、Framework二进制
二、IPA 中实际需要签名的范围
苹果代码签名机制遵循「所有可执行内容必须单独签名,所有资源内容必须被签名校验覆盖」的核心原则,具体分为两类:
1. 需要单独生成签名的独立实体
每一个独立的可执行模块都需要单独签名,生成对应的_CodeSignature文件夹:
- 主应用Target二进制
- 每一个动态Framework(静态库不需要单独签名,静态库会在编译时合并到所属的主应用/Extension二进制中)
- 每一个Extension Target(比如通知扩展、内容拦截扩展、Widget扩展等)
- 每一个内置的独立可执行二进制
- 嵌入的App Clips、Watch App 及其自身的Extension、Framework
2. 不需要单独签名但需被签名校验覆盖的文件
这些文件不会单独生成签名,但会被纳入所属模块的签名哈希校验范围,任意修改都会导致签名校验失败:
- 模块内的所有资源文件:图片、音视频、xib/storyboard编译后的nib文件、多语言字符串资源、配置文件(plist、json等)
- 模块的
Info.plist文件 - 资源包(
.bundle)内的所有文件 - 主应用根目录下的
embedded.mobileprovision描述文件
三、文件夹结构的签名规则
不需要对文件夹本身做直接签名,但文件夹层级结构会被间接纳入签名校验逻辑:
签名时会为每个模块生成CodeResources文件(存储在_CodeSignature文件夹下),该文件不仅记录了所有文件的哈希值,还记录了每个文件的相对路径。如果修改文件夹层级、移动文件位置,哪怕文件内容完全没有改动,也会因为相对路径不匹配导致校验失败,等效于文件夹结构被签名逻辑间接覆盖。
四、底层校验逻辑
所有签名校验逻辑最终都在iOS内核的Trust层执行,应用安装、启动时都会触发校验:
- 先校验每个独立模块的签名合法性,确认签名和描述文件匹配、证书链可信
- 再校验每个模块下的所有文件哈希、相对路径是否和
CodeResources中的记录完全一致 - 任意环节校验失败都会触发安装失败、启动崩溃、系统自动删除应用的逻辑
内容的提问来源于stack exchange,提问作者YMeC
相关产品推荐
相关产品推荐

