我正在尝试在iOS 5.1 / iPhone 4s(越狱)上运行未签名的应用程序。我做了什么:
禁用XCode中的代码签名。
内置未签名的iPhone应用程序。
通过SSH将其复制到我的iPhone到位置/User/me/development/HelloWorld.app
现在我尝试模拟其签名以在iPhone上运行此应用程序。我运行以下命令:
cd /User/me/development
chmod -R 777 HelloWorld.app
ldid -S HelloWorld
但是,我收到以下错误:
util/ldid.cpp(567): _assert(78:arch != NULL)
出现此类错误的可能原因是什么,现在要解决?
答案 0 :(得分:11)
1)使用ldid -S
是正确用法。不是小写(-s
)。
2)通常,当我收到此错误时,因为我使用错误的架构构建了我的应用程序。我使用的ldid
的大多数旧版本都无法签署 fat </ em>二进制文件(但请参阅下面的更新)。胖二进制文件是内部具有多个体系结构的二进制文件。例如,双armv6
和armv7
可执行文件。或者使用Xcode 4.5,它可能默认为arvm7
和armv7s
。
在项目构建设置中,使用体系结构,有效体系结构和仅构建活动体系结构设置来确定构建哪个体系结构可执行文件。对于越狱开发,我通常将仅构建活动架构设置为YES
。有效的图表设置为armv6
和armv7
。
3)此外,某些旧版本的ldid
无法签署armv7
个可执行文件。如果您获得pre-built copy from KennyTM's site here,则会支持armv7
。请注意,此ldid
是为Mac OS X构建的,因此它设计为在Mac上的可执行文件上运行,无需登录Xcode即可构建,但之前上传到你的iPhone。
较新的手机通常可以运行为旧架构构建的可执行文件,但不是相反。因此,构建您想要支持的最古老的架构。您将在新架构中失去一些优化(大多数人都不会太在意......如果您的应用需要这些优化,请告诉我,并且我会发布更多内容)。
因此,如果您想支持旧设备(iPhone&lt; 3GS),我会将体系结构设置为仅 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 found here 的预构建版本现在可以签署胖可执行文件,尽管仍有ldid
个版本浮动,但不能。此外,我认为如果您安装最新版本的iOSOpenDev,它将为您提供可以签署胖可执行文件的ldid
版本(/opt/iOSOpenDev/bin/ldid
的默认安装位置)。
答案 1 :(得分:3)
从Xcode 4.5开始,可能早在4.4没有检查过,为了使用ldid工具进行伪代码签名,你需要从here下载并安装'命令行工具'或者你可以从Xcode,Preferences-&gt; Downloads
中下载否则你会收到类似
的错误您仍然需要确保它不是“胖”二进制文件,并且不再支持armv7作为armv6。
ldid -S ExampleApp
答案 2 :(得分:0)
错误断言(2:false)来自HelloJB(不是HelloJB.app)被写保护的事实!