8

我正在尝试在 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)

这种错误的可能原因是什么,现在要修复它?

4

3 回答 3

11

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

2)通常,当我收到此错误时,是因为我使用错误的架构构建了我的应用程序。ldid我使用的大多数旧版本都无法签署二进制文件(但请参阅下面的更新)。胖二进制文件是内部具有多个架构的二进制文件。例如,双重armv6armv7可执行。或者使用 Xcode 4.5,它可能默认为armv7and armv7s

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

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

于 2012-10-07T22:03:40.390 回答
3

从看起来 Xcode 4.5 开始,可能早在 4.4 还没有检查,为了使用 ldid 工具进行伪代码签名,您需要从这里下载并安装“命令行工具”,或者您可以从 Xcode 中下载它,首选项->下载

否则你会得到类似的错误

  • 实用程序/ldid.cpp(584):
  • ./minimal/mapping.h(54): _assert(2:false)
  • 实用程序/ldid.cpp(567)
  • 等等

您仍然需要确保它不是“胖”二进制文件,并且仅支持 armv7,因为不再支持 armv6。

ldid -S ExampleApp

于 2012-11-06T06:57:59.633 回答
0

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

  1. 启动终端.app
  2. 转到目录 HelloJB.app
  3. chmod +aw HelloJB
  4. ldid -S HelloJB 有效!
于 2013-12-23T18:17:11.433 回答