执行更新Xcode 4.1~4.6 + iOS 5、iOS 6免证书(iDP)开发+真机调试+生成IPA全攻略
最近研究执行更新,稍微总结一下,以后继续弥补:
原创文章,欢送分享;未经许可,不得转载;版权所有,侵权必究
开辟环境使用的是目前为止最新的稳定版软件:Mac OS X Lion 10.7 + Xcode 4.1
目前Xcode 4.2 Preview版也已经发布,据说其修改方法跟4.1非常相似,只改动了一行代码,请参看参考文章的第二篇。本文仍以4.1版本为例。
更新:当初Xcode 4.2正式版和iOS 5均已发布,下面弥补上4.2的修改方法。(2011-10-24)
各步调会表明版本,比如(Xcode4.1请执行)和 (Xcode4.2请执行),4.2.1的修改方法与4.2完整相同
未表明的步调为两个版本均需执行的步调!
更新:当初Xcode 4.3已发布,修改方法相似,Xcode 4.3的修改步调将以 (Xcode4.3请执行)标出(2012-2-7)
更新:当初Xcode 4.3.2和iOS 5.1.1完善越狱均已发布,本文实时停止了更新。修改方法相似,Xcode 4.3.2的修改步调将以 (Xcode4.3.2请执行)标出(2012-5-28)
更新:Mountain Lion + Xcode 4.4已发布,本人尚未安装,但在评论中看到已经有友人测试胜利,这里祝愿这些友人!(2012年8月5日)
更新:Xcode 4.5 for Mountain Lion已发布。本人已经更新并亲测破解胜利。Xcode 4.5将原来XML格式的plist文件酿成了二进制格式,故修改方法略有不同,详细操作已在文中给出,请各位友人测试!(2012年10月2日更新)
2012年2月7日更新:
目前本人已经测试并证实有效的平台有
Xcode 4.1:
iPod touch 4 iOS 4.3.3
Xcode 4.2:
iPod touch 4 iOS 4.3.3
iPod touch 4 iOS 5.0
iPod touch 4 iOS 5.0.1
Xcode 4.2.1:
iPod touch 4 iOS 4.3.3
iPod touch 4 iOS 5.0.1
iPhone 4S iOS 5.0.1(5A406)
Xcode 4.3(2012年2月7日更新)
iPhone 4S iOS 5.0.1(5A406)
Xcode 4.3.2(2012年5月28日更新)
iPhone 4S iOS 5.1.1
Xcode 4.4.1 for Mountain Lion(2012年9月26日更新)
iPhone 4S iOS 5.1.1
Xcode 4.5 for Mountain Lion(2012年10月2日更新)
iPhone 4S iOS 5.1.1
Xcode 4.6 for Mountain Lion(2013年2月12日更新)
iPhone 4S iOS 6.1
另外,操作系统的版本貌似对调试影响不大,这期间用过的系统有Mac OS X 10.6~10.8.2,都没有问题。
当然您须要先越狱您的设备并通过Cydia安装AppSync
众所周知,在Xcode上开辟的程序只能在模拟器中运行,如果要放到真机上则要消费99美金购买开辟者证书iDP。这严峻阻碍了我等草根开辟者摸索的脚步。写个小程序,同学间分享一下这个小小的愿望都不能满意,自然不能善罢甘休。
本文参考了多篇文章,综合其中的方法,并修正其中的错误,整理而成。
未经许可,请勿转载。本文首次发表于http://kqwd.blog.163.com/
参考的文章有:
http://laolang.cn/back-end-develop/helloworld-iphone-developer.html
http://ccmos.tw/blog/2011/06/30/xcode4-port-program-to-idevice-without-idp/
http://www.cnblogs.com/flyingzl/articles/2207717.html
众所周知,在Xcode上开辟的程序只能在模拟器中运行,如果要放到真机上则要消费99美金购买开辟者证书iDP。这严峻阻碍了我等草根开辟者摸索的脚步。写个小程序,同学间分享一下这个小小的愿望都不能满意,自然不能善罢甘休。
在没有iDP的情况下,要想将程序放到iPhone上调试,并最终发布IPA用于分享,须要以下几个步调:
1.自己为自己发表一个证书用于为生成的程序签名
2.修改工程配置以及Xcode的配置文件和二进制文件以阻止其验证和签名
3.通过自定义生成步调,用伪造的证书为应用程序签名
4.使用一点小trick来生成IPA文件
1.创建证书
创建证书的进程比较简单,打开实用工具-钥匙串访问。然后在菜单栏里点击钥匙串访问-证书助理-创建证书来打开向导。第一个步调比较主要,
必须要把名称命名为iPhone Developer,将类型设定为代码签名,将"让我覆盖这些默许值"选中。以后的步调无需更改,一起点击“肯定”和“继续”来完成这个向导就可以。
![执行和更新](http://img.ph.126.net/jAeRPNeRgkVMEhzbZMhIHA==/1295629317816035869.png)
2.修改Xcode的配置文件和二进制文件
下面的步调稍微有点繁琐,您应该了解UNIX命令行的基本操作,并了解一种命令行文本编辑器,本文使用的是vim。尽管这里会给出完整的代码,但是关于修改和保存代码的基本操作,不再赘述。下面的操作请先
将Xcode按Command+Q完整关闭。
(1)修改配置文件
进入目录并备份原文件
(4.1、4.2、4.3在这里主要的差异是SDK的目录名不同)
(Xcode4.1请执行)cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/
(Xcode4.2请执行)cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/
(Xcode4.3请执行)cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk
(Xcode4.3.2请执行)cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk
(Xcode4.5请执行)cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk
(Xcode4.6请执行)cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
sudo cp SDKSettings.plist SDKSettings.plist.orig
停止编辑
(除了Xcode 4.5之外的版本,包括Xcode 4.6)
sudo vim SDKSettings.plist
将以下两段中的YES改为NO
<key>CODE_SIGNING_REQUIRED</key>
<string>
YES
</string>
和
<key>ENTITLEMENTS_REQUIRED</key>
<string>
YES
</string>
Xcode 4.5的plist格式不是XML,而是改为了Apple自己的二进制格式,我们使用Xcode本身来编辑这个plist文件,命令是
sudo /Applications/Xcode.app/Contents/MacOS/Xcode ./SDKSettings.plist
会启动Xcode的图形界面,我们开展DefaultProperties分支,将下面的CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED两个属性改为NO
下面修改另外一个文件
进入目录并备份原文件
(Xcode4.1/4.2请执行)cd /Developer/Platforms/iPhoneOS.platform/
(Xcode4.3/4.4/4.5/4.6请执行)cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
备份
sudo cp Info.plist Info.plist.orig
编辑文件
(Xcode4.1/4.2/4.3/4.4请执行)sudo vim Info.plist
将全部的
XCiPhoneOSCodeSignContext 修改成
XCCodeSignContext,网上的大部份文章说有2处,但我找到了3处,可能是Xcode 4.1要多一处?
(Xcode 4.2/4.3/4.3.2也有三处)总之都改掉了。提示:在在vim中输入
/要搜索的内容来搜索,按
n键是搜索下一处。
(Xcode 4.5/4.6)编辑命令如下
sudo /Applications/Xcode.app/Contents/MacOS/Xcode /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist
Xcode 4.5、4.6也有三处,分别在DefaultProperties分支下、RuntimeRequirements分支下和OverrideProperties分支下。
(2)二进制补丁
#在桌面上建立script这个脚本
cd ~/Desktop
vim script
#
(Xcode 4.1执行)在编辑器中输入如下内容
#!/bin/bash
cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "xc3x26x00x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support
#
(Xcode 4.2执行)在编辑器中输入如下内容
#!/bin/bash
cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "xc3x26x00x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support
保存并退出。(4.1和4.2在这里的区分也是目录名不同,就是代码中绿色的部份。4.1是
Plug-ins而4.2是
PrivatePlugIns)
授予这个脚本执行权限并执行它
chmod 777 script
./script
畸形的话应该输出(详细的数字可能有差异)
231+1 records in
231+1 records out
115904 bytes transferred in 0.001738 secs (66694555 bytes/sec)
#
(Xcode 4.3注意)在Xcode 4.3版本中,我没有找到iPhoneOS Build System Support.xcplugin这个插件,因此我跳过了这个步调,并且最终也胜利的停止了联机调试。因此我个人认为Xcode 4.3没有必要执行“二进制补丁”这一步调。请各位友人测试~!
#
(Xcode 4.3.2/4.4/4.5/4.6注意)在Xcode 4.3.2版本中,我们可以找到iPhoneOS Build System Support.xcplugin,但我没有修改它,仍然可以停止联机调试。这个修改步调是从Xcode 3.X中继承过来的,我们有理由猜想,在Xcode 4.x版本中,已经不须要修改这个文件了。(2012年5月28日更新)
至此,对SDK中配置文件和二进制文件的修改就完成了
3.预备自定义的生成后脚本
连接互联网后执行
#(Xcode 4.1/4.2执行)
mkdir /Developer/iphoneentitlements401
cd /Developer/iphoneentitlements401
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py
#(Xcode 4.3/4.4/4.5/4.6执行)
mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements
cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py
热情网友Ringo_D指出,这里可能涉及到权限问题。我做的时候貌似没有出啥问题,如果您在执行这段代码时碰到Permission denied提示的话,请将响应的语句后面加上sudo以获取超级权限。(2012年6月15日更新)
如果您已经联网,则请直接转到步调4,如果您没有联网,那么请在响应目录手动创建gen_entitlements.py并授予其执行权限,这个文件的内容为
#!/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()
4.修改工程设置
特别注意:本阶段之前的修改配置文件、预备脚本等,只须要做一次。但本阶段的操作,对每一个须要真机调试的工程都要做一遍。
这个步调的主要作用是支撑真机调试,如果不做这个步调,仍然可以通过步调5来生成ipa在真机上运行,但是无法使用Xcode内置的调试器对在真机上运行的程序停止单步跟踪。如果您的程序在点击Run真机调试时秒退,请检查此步调是不是正确完成。
(1)禁用Xcode自动的签名操作
将工程配置中所有的Code Signing选项全部设为Don't Code Sign,如图。可能须要先点击“All”让这个选项显示出来
![执行和更新](http://img.ph.126.net/COoAQeLE26iWVlMtNEei5A==/2529052665762129796.png)
(2)添加自定义的生成后脚本
在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,输入以下脚本
(对于Xcode 4.1/4.2)
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
(对于Xcode 4.3/4.4/4.5/4.6)
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
如图所示:
![执行和更新](http://img.ph.126.net/bBJubN8gFr5KAzCSvFEqvA==/672162244401931959.png)
至此配置全部完成,下面就可以插上iPhone,从新选择生成目标来测试一下在线调试了!如果是第一次使用该设备调试,请先在Organizer中将设备切换为开辟模式,详细操作请见常见问题5。
5.旁门左道生成IPA文件
如果我的程序调试好了,怎么才能发给别人用呢?畸形情况下IPA文件是从Xcode的Organizer中输出的,但是我们没有证书,这样输出会产生错误。我们只能用个小trick来完成这个操作了。
先将代码生成为Release目标,然后打开工程的输出文件夹,通常情况下这个目录是
/Users/你的用户名/Library/Developer/Xcode/DerivedData/以工程名打头的文件夹/Build/Products/Release-iphoneos
很纠结吧~这个目录下有个.app的文件,就是生成的程序了。把这个.app拖到iTunes中,它会出当初应用程序那个列表中,然后再把它从iTunes的那个列表中拖出来(比如拖到桌面),发生了什么?哈哈,它就这样酿成.ipa了!
把这个.ipa发给友人,大家就可以跟您一起分享这个程序了。
文章发表以来点击量已经超越了5000次,也收到了不少热情博友的反馈和疑问。现加以整理,列为常见问题。感谢大家的关注!(2011年12月2日)
常见问题:
不胜利的先看这里!!本文点击量超越6000,有数网友亲测胜利,如果您失败了基本可以肯定是您没有严格按照文中的方法操作,下面列出常见问题,切望各位友人发问前先看看!!(2011年12月14日)
1. 我是初学者,请问什么是权限?执行权限(x权限)是什么意思?什么是脚本?如何加执行权限?sudo是什么命令?vim是什么,如安在vim中保存更改?你说的目录我没找到怎么办?我有些步调没看明白,能不能加QQ交流?
解答:首先感谢您关注我的博客。这里要提醒各位初学者友人,Xcode提供了非常完善的模拟器调试环境,模拟器调试要比真机调试便利得多,也简单得多,使用模拟器调试程序是iOS开辟的常态。真机调试通常是在产品快要完工时才停止的,看一下程序在实际呆板上的视觉效果等等。还有依赖于加速度计的程序要测试一下加速度计的程序有无问题。所以初学者其实不须要一开始就停止真机调试。初学者配置真机调试的主要目标可能并非学习技巧,而是满意好奇心、寻求成就感甚至是为了向友人炫耀等等。而这些目标其实不值得您消费这么大的精力来浏览本文。
因此本文是给有必定基础的友人看的,各种命令是免不了的。UNIX中的基本命令比如cp,mv,cd,chmod,sudo啥的还有vim编辑器,如果您都没听说过,强烈提议您不要尝试本文提到的修改。一旦改错了轻则Xcode挂掉,重则系统崩溃。如果碰到解决不了的问题欢送留言讯问,务必给出详细的错误信息,否则无法判断。博主恕不解答相似于如何执行脚本代码,如何付与执行权限,如何使用vim编辑器(如何保存)等与iOS开辟无关的UNIX基础问题。博主非常愿意以文会友,结识有思想、有创意、有技巧的大牛。博主也会不定时到博客上对热情网友提出的问题停止简单的解答。但并没有充分的时光通过QQ对文中的步调停止手把手的解释和指导。这里先向有这类需求的友人说声负疚了!
2. 各种错误,错误信息中包含“No such file or directory”这句话
解答:错误信息的含义非常清晰,就是“没有这个文件或者目录”。这类错误通常是由于您拷贝代码时不全或者开辟环境安装错误等问题导致的。请再次检查报错的目录是不是存在,检查代码与本文给出的是不是严格分歧,各种检查吧~总之是初级错误
3. 联机调试时程序秒退,或者无法安装到设备,或者任何时候报错,错误信息中包含“code signing”、“CERT”、“signature”或者“certificate”字样的(最常见的错误!!)
解答:证书错误或者签名错误,这类问题就不要问了,肯定是因为您没有严格文中的步调做。提醒您检查的地方有(1)有无设置为Don't Code signing (2)生成后事件的代码是不是已经正确粘贴 (3)那个Python脚本是不是已经胜利执行 (4)设备是不是已经越狱并安装AppSync (5)第一步的iPhone Developer证书是不是已经正确创建
其中最可能出问题的就是生成后事件代码(文中的那个Run Script)没有正确执行。可能是您忘记了添加Run Script并粘贴那段代码,也可能是您没复制全,或者复制到了啥特殊字符导致执行出错。查看那个script的执行结果的方法是在Xcode左边的侧边栏里,点最靠右的一个标签(Show the Log navigator),看最近的一个Build日志(不是Debug日志),找到一行Run custom shell script "Run Script"那一行,畸形情况下那一行跟其他行一样,是不能开展的。如果那一行左边有个小箭头,点击后能开展的话,说明执行出错,开展后的信息即为出错的信息。请当真查看错误信息并修正脚本中的错误。如果Build日志里根本没有Run custom shell script "Run Script",那说明您忘记添加Build script了。。。(2012年2月9日更新)
弥补:Run Script经常报的一条错误是“replacing existing signature”。。。这个提示的意思是“替换已有的签名”,涌现这个提示的原因是,你并没有胜利的阻止Xcode使用默许的方法为应用程序签名。因为这个破解的情理就是阻止Xcode为app签名,而用script中的自定义进程手动为app签名。当script为app签名时,发明app已经被Xcode签名过了,就会报这个错误。出这个错误后提醒您检查的地方有两个(1)SDKSettings.plist中须要修改的地方是不是已经正确修改 (2)工程设置里是不是将那5个签名的选项全部设为Don't Code signing (2012年6月15日更新)
4. iPad能用吗?
解答:我没有iPad,所以没法准确答复。但从热情博友的回复来看,iPad无疑是可以用的。
感谢qingcheng89提出的改良看法,当初来看上述代码可以直接支撑iPad而无需修改,请各位友人测试。(2012年2月9日更新)
5. 为什么我的Build for Archiving选项是灰色的?
解答:是因为您没有把设备插到电脑上。虽然这个问题挺蠢的,但我曾经也有过这个疑问,哈哈~~
经热情网友xc7296815提醒,设备未开启开辟模式也会导致Build for Archiving不可用。开启开辟模式的方法是:插上设备,点Xcode右上角的Organizer图标,选中您的设备,看一下设备名称左边的小灯是什么颜色的。若是灰色代表未开启开辟模式。此时在右侧窗口中点击“
Use for Development
” 便可。若是黄色请从新插拔设备,若是绿色代表设备已经开启开辟模式(2011年12月25日)
关于启用开辟模式的弥补:点击Use for Development后,会要求输入Apple ID,这里点击取消便可。这时启用设备开辟模式的进程会立即终止。设备名称旁边应该有一个黄灯。此时从新插拔设备,Organizer中会涌现一个进度条,等这个进度条跑完,小灯就会酿成绿色,开辟模式已经启用。(2012年5月28日更新)
再弥补:最近经常有人发问说,无论怎么搞,Organizer中的灯始终是黄色的。这类情况几乎可以百分之百的肯定是您的Xcode版本不够高。如果您的设备是iOS 5.1.1,则必须使用Xcode 4.3.2或以上版本。一样的情理,iOS 5.0.1对应Xcode 4.3.1,iOS 5.0对应Xcode 4.3……(2012年6与5日更新)
6.我的iOS版本/Xcode版与你的不同,能用吗?
解答:本人测试过的环境和设备已经在文章开头给出。其他环境我没有测试过,也没有条件测试,因此当您的环境与我的不同时,别问我可不可用,您可以试一下,然后把结果告诉我,也为其他的网友提供便利,在此先谢谢您了!
7.真机调试时涌现
Error launching remote program: failed to get the task for process xxx错误(2012年1月26日更新)
解答:
我在调试中貌似没有碰到过这个问题,但是不少网友指出会有这个问题,谁来告诉我什么情况下会出这个问题呢?如果您碰到了这个问题,请浏览Apple官方的帮助文档http://developer.apple.com/library/ios/#qa/qa1710/_index.html
经本人测试,如果该错误出当初编译运行以后,且现象为设备上的程序闪退,则是由于签名错误导致的,这是由于您没有严格按照上述步调来做导致的,请参考常见问题3.(2012年2月9日更新)
文章好长...欢送各路大侠教正。
文章结束给大家分享下程序员的一些笑话语录:
一条狗在街上闲逛,看见橱窗里一张告示:「招聘程序员。会编程,有团队精神,至少精通两种语言。均等机会。」
那条狗就进去申请,但是被拒绝了。
「我不能雇一条狗在公司里做事。」经理说。
狗不服气,指着告示上「均等机会」几字抗议。
经理没法,叹了口气,不屑地问道:「你会编程吗?」
那条狗默默地走到电脑前,编了个程序,运作准确。
「你有团队精神吗?」经理问。
那条狗掉头看了看门外,一大群野狗在外面虎视耽耽。
「我真的不能雇狗做这份工作。」经理气急败坏地说。
「就算会编程、有团队精神,但是我需要的雇员至少要能精通两种语言。」
那条狗抬头看着经理说:「喵-噢。」