用 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是免费的
如要正常的签发流程,请恢复备份的原始配置文件。我还没有恢复过,不保证一定能恢复成功