用 Xcode 在 iOS 越狱设备上开发调试

参考自:http://zhuoqiang.me/jailbroken-ios-device-debug-using-xcode.html

开发iOS程序时,如果要在真机上调试,开发者向苹果交99美金的年费来取得iOS开发者账号。钱虽不多,但有些开发者只想练练手玩一玩iOS开发,并不在意能否在AppStore上发布应用。对这些票友来说,这笔投资就有点纠结了。

开发iOS越狱程序可以绕过这个限制,直接在真机上调试。但是要使用命令行界面。如果可以利用Xcode集成开发环境提供的便利性直接在真机上调试,那对开发效率的提升是巨大的。

下面就介绍在不申请iOS开发者账号的情况下,如何使用Xcode在越狱的iOS设备上进行开发调试。

iOS设备的设置

iOS在安装运行App时都需要先检查它的数字签名。苹果为安全起见,只允许官方数字签名签过的App在真机上运行。让我们先绕过这个限制:

越狱你的iOS设备。请自行放狗查找越狱教程

安装越狱应用AppSync。这需要在Cydia中添加源http://cydia.hackulo.us,然后选择一个适合本设备的版本安装。AppSync能让设备绕过苹果的数字签名验证机制,从而安装我们随后用私有签名签发的App(当然也能安装盗版App,这不在讨论范围之内,支持正版!)

重启iOS设备

每次iOS系统升级都要在设备上重复这一步。

生成私有签名

你需要一个数字签名来签发(codesign)App,这样App才能在iOS上运行。既然不想花99美金申请苹果官方的开发者签名,那就生成自己的私有签名。

苹果官方文档有详细的生成步骤:

打开MacOSX操作系统自带的实用工具中的钥匙串访问程序

在钥匙串访问程序的菜单中选择证书助理->创建证书

证书的名称一定要写iPhoneDeveloper,以避免不必要的麻烦

身份类型为自签名根证书,证书类型选代码签名

勾选让我覆盖这些默认值并继续

随便输入一个的序列号。只要保证序列号和证书名称唯一就可以了

输入证书信息,因为是私有证书,随便写一下就行

后面选择框都用默认值就好了

完成后就可以在钥匙串访问中看到这个刚创建的iPhoneDeveloper根证书了。它被标红警示此证书不被信任,表示它不是由权威机构认证生成。没关系,我们在上一步已经搞定了iOS设备,不再需要权威机构了。

这个步骤只需一次。

设置Xcode

我们需要告诉Xcode在编译调试时既不需要签名,也不用做自动的签发动作。最后还要指定使用私有签名来签发(codesign)我们的程序。

告诉Xcode不需要签名

因为需要更改Xcode的配置文件,我们首先要关闭Xcode。为了安全起见,在修改配置文件之前请备份原始文件。

以下的设置是以Xcode4.3和iOSSDK5.0为例。其它版本的路径略有不同,请自行修改。

cd/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/

sudocpInfo.plistInfo.plist.orig

sudoviInfo.plist

找到

<key>CODE_SIGNING_REQUIRED</key>

<string>YES</string>

将YES改为NO。

再找

<key>ENTITLEMENTS_REQUIRED</key>

<string>YES</string>

也将YES改为NO

再用同样方法,先备份/Developer/Platforms/iPhoneOS.platform/Info.plist配置文件,然后修改其中所有的

<key>CODE_SIGN_CONTEXT_CLASS</key>

<string>XCiPhoneOSCodeSignContext</string>

替换其中的XCiPhoneOSCodeSignContext为XCCodeSignContext

最后,我们要修改Xcode的iPhone开发plugin

cd/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\Build\System\Support.xcplugin/Contents/MacOS/

ddif=iPhoneOS\Build\System\Supportof=workingbs=500count=255

printf"\xc3\x26\x00\x00">>working

mv-niPhoneOS\Build\System\SupportiPhoneOS\Build\System\Support.original

mvworkingiPhoneOS\Build\System\Support

chmoda+xiPhoneOS\Build\System\Support

这样一来,Xcode就知道iOS的程序不需要签名了。

该步骤对每个新安装的Xcode和iOSSDK版本都要做一遍。

告诉Xcode不用做签发动作

打开任意的Xcode工程,选择项目文件,在BuildSettings中找到CodeSigning项,选出CodeSigningIdentity的子条目AnyiOSSDK,将它设置为Don'tCodeSign。

指示Xcode使用私有签名签发App

保存下面的python脚本:

#!/usr/bin/env python

import sys
import struct

if len(sys.argv) != 3:
    print "Usage: %s appname dest_file.xcent" % sys.argv[0]
    sys.exit(-1)

APPNAME = sys.argv[1]
DEST = sys.argv[2]

if not DEST.endswith('.xml') and not DEST.endswith('.xcent'):
    print "Dest must be .xml (for ldid) or .xcent (for codesign)"
    sys.exit(-1)

entitlements = """
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>%s</string>
    <key>get-task-allow</key>
    <true/>
</dict>
</plist>
""" % APPNAME

f = open(DEST,'w')
if DEST.endswith('.xcent'):
    f.write("\xfa\xde\x71\x71")
    f.write(struct.pack('>L', len(entitlements) + 8))
f.write(entitlements)
f.close()

假定脚本保存在/Developer/iphoneentitlements401/gen_entitlements.py,设为可执行

chmod777/Developer/iphoneentitlements401/gen_entitlements.py

最后,在每一个需要设备调试的工程里都要指定运行该脚本。选中工程文件,在BuildPhases页中点击右下角的AddBuildPhase按钮。在Shell框中输入下面的脚本:

exportCODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate

if["${PLATFORM_NAME}"=="iphoneos"];then

/Developer/iphoneentitlements401/gen_entitlements.py"my.company.${PROJECT_NAME}""${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";

codesign-f-s"iPhoneDeveloper"--entitlements"${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent""${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"

fi

开始调试

打开设置好的Xcode工程,连上iOS设备。打开Xcode的Organizer面版,在左边的Device列表中选中连接上的iOS设备,点击UseforDevelopment,对弹出的对话框都选择拒绝或Cancel。

现在点击Run按钮,看看你的设备,见证奇迹的时刻到了。

你也可以切换到Debug版本进行调试:选择菜单Product->EditScheme…将RunYourAppName.app中的BuildConfiguration改为Debug。

至此,你就可以免掉99美金的年费尽情的在真机上调试应用了。

补充

本文的方案严重参考http://www.alexwhittemore.com/developing-jailbroken-iphone-ios-401/向原作者致谢

该方案经验证能在Xcode3~4,iOS4~5版本上运行。不同版本的配置文件路径有所不同,请自行修改

要在AppStore上发布你的应用,99美金的年费是无论如何省不下来的。其实价格倒也公道,毕竟Xcode是免费的

如要正常的签发流程,请恢复备份的原始配置文件。我还没有恢复过,不保证一定能恢复成功

相关推荐