1)使用ldid -S
是正确的用法。不是小写 ( -s
)。
2)通常,当我收到此错误时,是因为我使用错误的架构构建了我的应用程序。ldid
我使用的大多数旧版本都无法签署胖二进制文件(但请参阅下面的更新)。胖二进制文件是内部具有多个架构的二进制文件。例如,双重armv6
和armv7
可执行。或者使用 Xcode 4.5,它可能默认为armv7
and armv7s
。
在项目构建设置中,使用Architectures、 Valid Architectures和Build Active Architecture Only设置来确定构建哪个架构可执行文件。对于越狱开发,我通常将Build Active Architecture Only设置为YES
. 并且有效架构设置为armv6
和armv7
。
3)此外,一些旧版本的ldid
无法签署armv7
可执行文件。如果您从此处的 KennyTM 网站获得预建副本,它支持armv7
. 请注意,这ldid
是为 Mac OS X 构建的,因此它被设计为在您的 Mac 上的可执行文件上运行,在构建之后没有登录 Xcode,但在您上传到您的 iPhone 之前。
较新的手机通常可以运行为旧架构构建的可执行文件,但反之则不行。因此,为您想要支持的最古老的架构构建。您只会在较新的架构中失去一些优化(大多数人不太关心......如果您的应用需要这些优化,请告诉我,我会发布更多)。
因此,如果您想支持旧设备(iPhone < 3GS),我会将Architectures设置为only armv6
,并确保删除$(ARCHS_STANDARD_32_BIT)
. 如果您只需要支持相对较新的版本,请选择armv7
,但请确保您使用ldid
可以签署armv7
二进制文件的版本。
编辑:要确定您尝试签名的可执行文件是否是胖文件,请在命令行运行:
> 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
)。