如何使用ldid?

我试图运行iOS 5.1 / iPhone 4s(越狱)未签名的应用程序。 我做了什么:

  1. 在XCode中禁用代码签名。

  2. build立未签名的iPhone应用程序。

  3. 复制到我的iPhone通过SSH到/User/me/development/HelloWorld.app位置

  4. 现在我尝试模拟它的签名在iPhone上运行这个应用程序。 我运行follwing命令:

cd /User/me/development chmod -R 777 HelloWorld.app ldid -S HelloWorld 

但是,我收到以下错误:

 util/ldid.cpp(567): _assert(78:arch != NULL) 

这种错误的可能原因是什么,现在要解决这个问题?

1)使用ldid -S正确的用法。 不小写( -s )。

2)通常,当我得到这个错误,这是因为我build立了我的应用程序错误的体系结构。 我使用的大多数旧版本的ldid都不能签署二进制文件(但请参阅下面的更新 )。 胖二进制文件是内部不止一个架构的文件。 例如,一个双armv6armv7可执行文件。 或者用Xcode 4.5,它可能是默认的arvm7armv7s

在项目构build设置中,使用“ 体系结构” ,“ 有效体系结构”和“ 仅构build活动体系结构”设置来确定构build哪个体系结构可执行文件 对于越狱开发,我通常将Build Active Architecture设置为YES 。 和有效的archicture设置为armv6armv7

3)另外,一些老版本的ldid不能签署armv7可执行文件。 如果你从KennyTM的网站上获得预置的拷贝 ,它支持armv7 。 请注意,这个ldid是为Mac OS X而devise的,所以它被devise成在没有loginXcode的情况下构build,而是你上传到你的iPhone 之前 ,在Mac上的可执行文件上运行。

较新的手机通常可以运行为较旧的体系结构构build的可执行文件,而不是相反。 所以,build立你想要支持的最古老的build筑。 你只会在新的体系结构中失去一些优化(大多数人不太在意…让我知道你的应用程序是否需要这些优化,我会发布更多)。

所以,如果你想支持旧设备(iPhone <3GS),我会设置架构 只有 armv6 ,确保删除默认设置$(ARCHS_STANDARD_32_BIT) 。 如果你只需要支持相对较新的,那么selectarmv7 ,但是确保你使用了可以签署armv7二进制文件的ldid版本。

编辑:确定您要签名的可执行文件是否是胖文件,请在命令行运行:

 > cd HelloJB.app > ls HelloJB Info.plist PkgInfo date.zip en.lproj > lipo -info HelloJB Non-fat file: HelloJB is architecture: armv7 

正如你在上面的输出中看到的,我的HelloJB可执行文件不胖,只有armv7代码。

更新

我相信在这里find的ldid的预build版本现在可以签署胖可执行文件,虽然仍然有漂浮的ldid版本不能。 另外,我认为,如果你安装了iOSOpenDev的最新版本,它会给你一个可以签署胖可执行文件的默认安装位置/opt/iOSOpenDev/bin/ldid

从Xcode 4.5开始,也许早在4.4还没有检查过,为了使用ldid工具伪造代码,需要从这里下载并安装'Command Line Tools',或者你可以从Xcode下载,首选项 – >下载

否则,你会得到像这样的错误

  • UTIL / ldid.cpp(584):
  • ./minimal/mapping.h(54):_assert(2:false)
  • UTIL / ldid.cpp(567)
  • 等等

你仍然需要确保它不是一个“胖”的二进制文件,只有armv7不再支持armv6。

ldid -S ExampleApp

错误assert(2:false)来自于HelloJB(不是HelloJB.app)被写保护的事实!

  1. 启动Terminal.app
  2. 转到目录HelloJB.app
  3. chmod + aw HelloJB
  4. ldid -S HelloJB的作品!