如何使用ldid?

9

我想在iOS 5.1/iPhone 4s(越狱)上运行未签名的应用程序。我的操作步骤如下:

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

  2. 构建未签名的iPhone应用程序。

  3. 通过SSH将其复制到我的iPhone,位置为/User/me/development/HelloWorld.app。

  4. 现在我尝试模拟其签名以在iPhone上运行此应用程序。我运行以下命令:

.

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

然而,我收到了以下错误:

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

可能出现此错误的原因有哪些,如何修复?
3个回答

11

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

2) 通常情况下,当我遇到这个错误时,是因为我使用错误的架构来构建我的应用程序。 我使用的大多数旧版本的ldid都无法签署fat二进制文件(但请参见下面的更新)。 Fat二进制文件是指内含多种架构的文件,例如:一个双架构的armv6armv7可执行文件。或者在Xcode 4.5下,默认会使用armv7armv7s

在项目构建设置中,使用 Architectures, Valid ArchitecturesBuild Active Architecture Only 设置来确定构建哪种架构的可执行文件。对于越狱开发,我通常将 Build Active Architecture Only 设置为 YES。并将有效的架构设置为 armv6armv7

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)。


1
@VASoftOnline,是的。这是XCode的默认设置。我只会将架构设置为构建armv7,然后让ldid对非通用可执行文件进行代码签名。 - Nate
1
@spamguy,检查fat二进制文件的方法还有其他途径。你可以尝试其中一种方法,看看是否是这个问题?或者只需查看Xcode构建设置,看看是否配置为仅构建一个架构? - Nate
1
@ItayLevin,如果它列出了armv7,那么它就不是一个通用二进制文件。CPU类型和子类型只是两个不同的描述符,但根据你发布的内容,我只看到了armv7这一种架构,所以它不是通用二进制文件。 - Nate
1
"cputype (12) cpusubtype (11)" 是 armv7s。xcrun -sdk iphoneos lipo -info ... 将正确显示该值。已经存在一个问题报告,因为 /usr/bin/lipo 无法识别处理器和架构。 - jww
1
我可以确认更新后的ldid似乎可以签署fat二进制文件。别忘了给你的二进制文件也加上执行权限。最后,如果你没有Mac,现在可以使用Travis CI来完成这个任务,具体请参见https://github.com/OneBusAway/onebusaway-iphone。 - bbodenmiller
显示剩余4条评论

3
从Xcode 4.5开始(也许早在4.4,未经检查),为了使用ldid工具伪代码签名,您需要从此处下载并安装“命令行工具”,或者您可以从Xcode中下载它,依次选择“偏好设置”->“下载”。否则,您将会遇到以下错误: util/ldid.cpp(584): ./minimal/mapping.h(54): _assert(2:false) util/ldid.cpp(567) 等等。
您仍然需要确保它不是“fat”二进制文件,只有armv7,因为不再支持armv6。 ldid -S ExampleApp

0

错误assert(2:false)的原因是HelloJB(而不是HelloJB.app)被写保护了!

  1. 启动Terminal.app
  2. 进入HelloJB.app目录
  3. 执行chmod +aw HelloJB
  4. 执行ldid -S HelloJB即可解决问题!

这似乎是一条评论(关于Omar的回答?)...而不是对这个问题的回答。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接