1) 使用 ldid -S
是正确的用法。 不要使用小写字母 (-s
)。
2) 通常情况下,当我遇到这个错误时,是因为我使用错误的架构来构建我的应用程序。 我使用的大多数旧版本的ldid
都无法签署fat二进制文件(但请参见下面的更新)。 Fat二进制文件是指内含多种架构的文件,例如:一个双架构的armv6
和armv7
可执行文件。或者在Xcode 4.5下,默认会使用armv7
和armv7s
。
在项目构建设置中,使用 Architectures, Valid Architectures 和 Build Active Architecture Only 设置来确定构建哪种架构的可执行文件。对于越狱开发,我通常将 Build Active Architecture Only 设置为 YES
。并将有效的架构设置为 armv6
和 armv7
。
3) 另外,有些旧版本的ldid
无法签署armv7
可执行文件。 如果您从KennyTM 的网站下载预编译副本,它支持armv7
。请注意,这个ldid
是为Mac OS X构建的,因此它设计用于在Xcode未签名构建之后在您的Mac上运行可执行文件,但在上传到您的iPhone之前。
新手机通常可以运行为旧架构构建的可执行文件,但反之则不行。 因此,要为您想要支持的最老的架构进行构建。 您只会失去一些在新架构中的优化(大多数人不太关心...如果您的应用程序需要这些优化,请告诉我,我会发布更多信息)。
因此,如果您想支持旧设备(iPhone< 3GS),则应将Architectures设置为仅armv6
,并确保删除默认设置$(ARCHS_STANDARD_32_BIT)
。 如果您只需要支持相对较新的设备,则选择armv7
,但请确保使用可以签署armv7
二进制文件的ldid
版本。
Edit: 要确定您尝试签名的可执行文件是否为fat文件,请在命令行上运行此命令:
> cd HelloJB.app
> ls
HelloJB Info.plist PkgInfo date.zip en.lproj
> lipo -info HelloJB
Non-fat file: HelloJB is architecture: armv7
从上面的输出可以看到,我的HelloJB
可执行文件不是胖的,只有armv7代码。
更新
我相信在这里找到的ldid预编译版本现在可以签名胖的可执行文件,尽管仍然有一些不能签名的ldid
版本在流传。此外,我认为如果你安装了最新版本的iOSOpenDev,它会给你一个可以签名胖的可执行文件的ldid
版本(默认安装位置为/opt/iOSOpenDev/bin/ldid
)。
armv7
,然后让ldid
对非通用可执行文件进行代码签名。 - Natearmv7
,那么它就不是一个通用二进制文件。CPU类型和子类型只是两个不同的描述符,但根据你发布的内容,我只看到了armv7
这一种架构,所以它不是通用二进制文件。 - Natexcrun -sdk iphoneos lipo -info ...
将正确显示该值。已经存在一个问题报告,因为/usr/bin/lipo
无法识别处理器和架构。 - jww