前提:
眾所周知,在Xcode上開(kāi)發(fā)的程序只能在模擬器中運(yùn)行,如果要放到真機(jī)上則要花費(fèi)99美金購(gòu)買開(kāi)發(fā)者證書(shū)iDP。本文介紹的是在上一代 Xcode4.6.3上演示的,為何使用上一代版本的呢?很簡(jiǎn)單,ios7還沒(méi)有實(shí)現(xiàn)大眾化越獄,所以很少有人使用越獄的ios7系統(tǒng)(大神除外),若要 運(yùn)行Xcode5,鑒于無(wú)開(kāi)發(fā)者證書(shū)且無(wú)越獄,想免費(fèi)真機(jī)運(yùn)行自己編寫(xiě)的ipa文件的話,只有ios7越獄才是唯一出路,所以在沒(méi)有iDP的情況下,要想 將程序放到iPhone上調(diào)試,并最終發(fā)布ipa用于分享,需要以下幾個(gè)步驟:
1.自己為自己頒發(fā)一個(gè)證書(shū)用于為生成的程序簽名;
2.修改工程配置以及Xcode的配置文件和二進(jìn)制文件以阻止其驗(yàn)證和簽名;
3.通過(guò)自定義生成步驟,用偽造的證書(shū)為應(yīng)用程序簽名;
4.使用一點(diǎn)小技巧來(lái)生成ipa文件;
5.需要先越獄您的ios6系統(tǒng)的設(shè)備并通過(guò)Cydia安裝AppSync for ios4/5/6。
工具:iphone4 6.1.2已完美越獄,MacBook Pro13inch,Xcode4.6.3,Plist Editor(編輯plist文件使用)。
正式進(jìn)入正題:
一、創(chuàng)建證書(shū)
打開(kāi)實(shí)用工具-鑰匙串訪問(wèn)。然后在菜單欄里點(diǎn)擊鑰匙串訪問(wèn)-證書(shū)助理-創(chuàng)建證書(shū)來(lái)打開(kāi)向?qū)А5谝粋€(gè)步驟比較重要,必須要把名稱命名為iPhone Developer,將類型設(shè)定為代碼簽名,將讓我覆蓋這些默認(rèn)值選中。之后的步驟無(wú)需更改,一路點(diǎn)擊“確定”和“繼續(xù)”來(lái)完成這個(gè)向?qū)Ь涂梢裕?/p>
二、修改Xcode的配置文件
1.請(qǐng)先將Xcode按Command+Q完全關(guān)閉。
2.修改配置文件:
按照該路徑找到SDKSettings.plist然后進(jìn)行編輯:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/SDKSettings.plist
將以下兩段中的YES改為NO
<key>CODE_SIGNING_REQUIRED</key>
<string>YES</string>
和
<key>ENTITLEMENTS_REQUIRED</key>
<string>YES</string>
3.下面修改另外一個(gè)文件:
按照該路徑找到Info.plist然后進(jìn)行編輯:
Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist
將Info.plist中全部的XCiPhoneOSCodeSignContext 修改成 XCCodeSignContext,他們分別在DefaultProperties分支下、OverrideProperties分支下和RuntimeRequirements分支下。
4.添加文件:
連接互聯(lián)網(wǎng)后在終端執(zhí)行:
mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements
cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements
curl -O
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py
如果沒(méi)有聯(lián)網(wǎng),可以在/Applications/Xcode.app/Contents/Developer文件夾下創(chuàng)建一個(gè)iphoneentitlements文件夾,然后在該文件夾下手動(dòng)創(chuàng)建一個(gè)gen_entitlements.py文件,并授予其執(zhí)行權(quán)限(命令:sudo),這個(gè)文件的內(nèi)容為:
#!/usr/bin/env python
import sys
import struct
if len(sys.argv) != 3:
print Usage: %s appnamedest_file.xcent % sys.argv[0]
sys.exit(-1)
APPNAME = sys.argv[1]
DEST = sys.argv[2]
if not DEST.endswith('.xml') and notDEST.endswith('.xcent'):
print Dest must be .xml (for ldid) or.xcent (for codesign)
sys.exit(-1)
entitlements =
<?xml version=1.0encoding=UTF-8?>
<!DOCTYPE plist PUBLIC-//Apple//DTD PLIST 1.0//EN >
<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()
三、修改工程設(shè)置(真機(jī)調(diào)試閃退的,請(qǐng)仔細(xì)的看此步驟,這步就是關(guān)鍵問(wèn)題所在)
特別注意:本階段之前的修改配置文件、準(zhǔn)備腳本等,只需要做一次。但本階段的操作,對(duì)每個(gè)需要真機(jī)調(diào)試的工程都要做一遍。
這個(gè)步驟的主要作用是支持真機(jī)調(diào)試,如果不做這個(gè)步驟,仍然可以通過(guò)步驟5來(lái)生成ipa在真機(jī)上運(yùn)行,但是無(wú)法使用Xcode內(nèi)置的調(diào)試器對(duì)在真機(jī)上運(yùn)行的程序進(jìn)行單步跟蹤。如果您的程序在點(diǎn)擊Run真機(jī)調(diào)試時(shí)秒退,請(qǐng)檢查此步驟是否正確完成。
1.禁用Xcode自動(dòng)的簽名操作
將工程配置中所有的Code Signing選項(xiàng)全部設(shè)為Don't Code Sign,如圖。可能需要先點(diǎn)擊“All”讓這個(gè)選項(xiàng)顯示出來(lái)。
2.添加自定義的生成后腳本
在Build Phases中添加一個(gè)Phase,右下角的Add Build Phase,然后單擊Add Run Script,輸入以下腳本:
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.pymy.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
如圖所示:
至此配置全部完成,下面就可以插上iPhone,重新選擇生成目標(biāo)來(lái)測(cè)試一下在線調(diào)試了!如果是第一次使用該設(shè)備調(diào)試,請(qǐng)先在Organizer中將設(shè)備切換為開(kāi)發(fā)模式(iPhone右部的小綠點(diǎn)亮)。
四、生成IPA文件
如果我的程序調(diào)試好了,怎么才能發(fā)給別人用呢?正常情況下ipa文件是從Xcode的Organizer中輸出的,但是我們沒(méi)有證書(shū),這樣輸出會(huì)產(chǎn)生錯(cuò)誤。我們只能用個(gè)小技巧來(lái)完成這個(gè)操作了。
先將代碼生成為Release目標(biāo),然后打開(kāi)工程的輸出文件夾,通常情況下這個(gè)目錄是/Users/用戶名/Library/Developer /Xcode/DerivedData/以工程名打頭的文件夾/Build/Products/Release-iphoneos這個(gè)目錄下有個(gè) xxx.app的文件,就是生成的程序了。把這個(gè)xxx.app拖到iTunes中,它會(huì)出現(xiàn)在應(yīng)用程序那個(gè)列表中,然后再把它從iTunes的那個(gè)列表 中拖出來(lái)(比如拖到桌面),它就這樣變成xxx.ipa了!把這個(gè).ipa發(fā)給別人,大家就可以跟您一起分享這個(gè)程序了