Xcode 4.1/4.2/4.3/4.4/4.5 + iOS 5.1.1免證書(iDP)開發...

開發環境使用的是目前爲止最新的穩定版軟件: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

另外,操做系統的版本貌似對調試影響不大,這期間用過的系統有Mac OS X 10.6~10.8.2,都沒有問題。

固然您須要先越獄您的設備並經過Cydia安裝AppSync
本文參考了多篇文章,綜合其中的方法,並修正其中的錯誤,整理而成。
未經許可,請勿轉載。本文首次發表於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,將類型設定爲代碼簽名,將"讓我覆蓋這些默認值"選中。以後的步驟無需更改,一路點擊「肯定」和「繼續」來完成這個嚮導就能夠。
Xcode 4.1免證書(iDP)開發+真機調試+生成IPA全攻略 - 月下獨酌 - 錦瑟華年

2.修改Xcode的配置文件和二進制文件
下面的步驟稍微有點繁瑣,您應該瞭解UNIX命令行的基本操做,並瞭解一種命令行文本編輯器,本文使用的是vim。儘管這裏會給出完整的代碼,可是關於修改和保存代碼的基本操做,再也不贅述。下面的操做請先 將Xcode按Command+Q徹底關閉
(1)修改配置文件
進入目錄並備份原文件 (4.一、4.二、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

sudo cp SDKSettings.plist SDKSettings.plist.orig
進行編輯 (Xcode 4.5以前)
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_REQUIREDENTITLEMENTS_REQUIRED兩個屬性改成NO

下面修改另一個文件
進入目錄並備份原文件
(Xcode4.1/4.2請執行) cd /Developer/Platforms/iPhoneOS.platform/
(Xcode4.3/4.4/4.5請執行) cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform

備份
sudo cp Info.plist Info.plist.orig
進行編輯
sudo vim Info.plist
將所有的 XCiPhoneOSCodeSignContext  修改爲  XCCodeSignContext,網上的大部分文章說有2處,但我找到了3處,多是Xcode 4.1要多一處? (Xcode 4.2/4.3/4.3.2也有三處)總之都改掉了。提示:在在vim中輸入 /要搜索的內容來搜索,按 n鍵是搜索下一處。

(Xcode 4.5)編輯命令以下
sudo /Applications/Xcode.app/Contents/MacOS/Xcode /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist
Xcode 4.5也有三處,分別在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注意)在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執行)
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」讓這個選項顯示出來
Xcode 4.1免證書(iDP)開發+真機調試+生成IPA全攻略 - 月下獨酌 - 錦瑟華年
 
(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)
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

如圖所示:
Xcode 4.1免證書(iDP)開發+真機調試+生成IPA全攻略 - 月下獨酌 - 錦瑟華年
 
至此配置所有完成,下面就能夠插上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無疑是能夠用的。
若是要用ipad 須要把第四步腳本文件裏的 platform_name == iphones 換成platform_name == ipads 否則會報錯的~ (感謝博友xyishao的建議)
感謝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
2012年2月1日更新:有網友指出該錯誤是因爲權限設置錯誤致使的。因爲我使用了跟報錯的那位網友徹底相同的環境,而在操做過程當中並無遇到這個錯誤,因此基本能夠肯定是您沒有按步驟操做形成的,請您再次檢查整個過程,尤爲是熱心網友提出的下載腳本並修改執行權限的部分。
經本人測試,若是該錯誤出如今編譯運行以後,且現象爲設備上的程序閃退,則是因爲簽名錯誤致使的,這是因爲您沒有嚴格按照上述步驟來作致使的,請參考常見問題3.(2012年2月9日更新)

文章好長...歡迎各路大俠指正。
相關文章
相關標籤/搜索