參考網上各位前輩的做法,操作中遇到一些問題,也遇到了跟前輩的描述有出入的地方,是以寫個文章記錄下我的操作過程,如果有朋友恰巧與我遇到同樣的問題,希望能有所幫助。
環境:
mac os 10.8
xcode 4.6
已經越獄的iPhone,ios 5.1.1
1)打開 Finder->應用程式->實用工具 -> 鑰匙串通路
2)單擊:"鑰匙串通路"選擇 "證書" 再選擇"建立證書"過程如下圖:

2.修改xcode配置檔案
1)修改SDKsettings.plist檔案
點選桌面,頂部菜單欄點選前往,選擇前往檔案夾,輸入路徑/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
将目錄下的SDKSettings.plist檔案複制一份,預設名稱為SDKSettings副本.plist
打開SDKSettings副本.plist,把CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED的值改成NO
将SDKSettings.plist檔案重命名為SDKSettings.plist.bak,将SDKSettings副本.plist重命名為SDKSettings.plist
2)修改Info.plist檔案
點選桌面,頂部菜單欄點選前往,選擇前往檔案夾,輸入路徑/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/
将目錄下的Info.plist檔案複制一份,預設名稱為Info副本.plist
打開Info副本.plist,空白處右鍵單擊選擇Add Row,增加兩項:
PROVISIONING_PROFILE_ALLOWED 值為 NO
PROVISIONING_PROFILE_REQUIRED 值為 NO
3)将上面Info副本.plist檔案中的 "XCiPhoneOSCodeSignContext" 替換成"XCCodeSignContext"(共3處)
3.建立腳本檔案gen_entitlements.py并賦予權限
注:如果你的電腦聯網了,那麼執行1)的指令後會在相應的目錄自動建立iphoneentitlements檔案夾及其下的gen_entitlements.py檔案,如執行後沒有生成指定檔案,請重複執行下面的指令或者換第二種方法,兩種生成腳本檔案的方法任選一種。
1)在終端執行如下指令:
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
sudo chmod 777 gen_entitlements.py
2)上面的指令執行成功之後,會在/Applications/Xcode.app/Contents/Developer/目錄下生成一個iphoneentitlements檔案夾和其下的gen_entitlements.py檔案,如果你的電腦沒有聯網或者不能自動生成相關目錄檔案,那麼需要手動在相應的目錄建立指定的檔案,随後需要給gen_entitlements.py設定權限。
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()
在終端給gen_entitlements.py設定權限(可能會要你輸入密碼)
sudo chmod 777 /Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py
4.修改項目屬性
1)點選項目圖示,找到"Build Settings"選項下的"Code Sign Identity",将其值全部改為"Don't Code Sign"
2)切換到Build Phases選項,點選右下角的Add Build Phase,然後單擊Add Run Script,然後在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.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
5.連接配接裝置(iphone/ipad)
點XCode右上角的Organizer圖示,然後選中你的裝置,在右邊視窗中點選“Use for Development” 即可,此時你的裝置名稱旁邊應該顯示黃色的小燈,重新拔插資料線,Organizer中會出現一個進度條,等這個進度條跑完,小燈就會變成綠色,開發模式已經啟用。
6.真機調試
至此,真機調試應該是完成了
但是我的失敗了,報的錯是
env: python\r: No such file or directory
/Users/xx/Library/Developer/Xcode/DerivedData/test-glumoxjzztqvstbbrqyydevjiubv/Build/Products/Debug-iphoneos/test.app/test.xcent: cannot read entitlement data
從csdn下載下傳頻道下載下傳了個文檔,按照文檔把腳本,也就是Build Phases裡的腳本改成了
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
再運作,不報錯了,但是真機裡還是閃一下就退出了
之後又下載下傳了ios 5.1的模拟器,模拟器運作成功過一次(不知道為什麼隻有這一次成功了),再在真機上運作又報錯CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 5.1'
經過無數次嘗試之後,還是老樣子,不是報錯就是閃退,無可奈何之下,下載下傳了xcode 4.4,因為xcode 4.4帶的是sdk5.1,跟我的真機系統版本是一樣的,當時猜想也許是sdk的原因
重複上面的操作,還是報cannot read entitlement data的錯誤。
經過多天的折磨一直不能解決,隻好周末回家繼續,沒想到回家隻是重複執行了一遍步驟3裡的第一種方法就可以真機調試了,真是喜出望外。
回想在機關不成功的原因,可能是由于機關的網絡設定了代理,當時我的操作過程是這樣的:執行步驟3的第一種方法,貌似一切順利,并沒有報錯,執行完後打開gen_entitlements.py檔案,檔案内容是502 Bad Gateway之類的一堆英文,再手動把步驟3裡第二種方法的代碼粘貼到gen_entitlements.py檔案,這一步中就出現了一個小問題,用文本編輯器打開gen_entitlements.py檔案并修改後不能儲存,提示沒有權限,但是用xcode卻可以儲存,當時我就直接用xcode儲存的,忽略了權限的問題。
好了,問題解決了,果然跟網上各位前輩說的一樣,指令沒有執行成功,權限沒賦上的原因,這個低級錯誤浪費了我相當長的時間,雖然這種情況極少發生,但還是想說出來供大家參考也給我自己一個提醒,謝謝各位前輩對我的幫助。