如何使用ldid?
我试图运行iOS 5.1 / iPhone 4s(越狱)未签名的应用程序。 我做了什么:
-
在XCode中禁用代码签名。
-
build立未签名的iPhone应用程序。
-
复制到我的iPhone通过SSH到/User/me/development/HelloWorld.app位置
-
现在我尝试模拟它的签名在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
都不能签署胖二进制文件(但请参阅下面的更新 )。 胖二进制文件是内部不止一个架构的文件。 例如,一个双armv6
和armv7
可执行文件。 或者用Xcode 4.5,它可能是默认的arvm7
和armv7s
。
在项目构build设置中,使用“ 体系结构” ,“ 有效体系结构”和“ 仅构build活动体系结构”设置来确定构build哪个体系结构可执行文件 对于越狱开发,我通常将Build Active Architecture设置为YES
。 和有效的archicture设置为armv6
和armv7
。
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)被写保护的事实!
- 启动Terminal.app
- 转到目录HelloJB.app
- chmod + aw HelloJB
- ldid -S HelloJB的作品!