天天看點

破解xcode無證書真機調試

參考網上各位前輩的做法,操作中遇到一些問題,也遇到了跟前輩的描述有出入的地方,是以寫個文章記錄下我的操作過程,如果有朋友恰巧與我遇到同樣的問題,希望能有所幫助。

環境:

mac os 10.8

xcode 4.6

已經越獄的iPhone,ios 5.1.1

1)打開  Finder->應用程式->實用工具 ->  鑰匙串通路 

2)單擊:"鑰匙串通路"選擇  "證書" 再選擇"建立證書"過程如下圖:

破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試

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

破解xcode無證書真機調試

将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

破解xcode無證書真機調試

3)将上面Info副本.plist檔案中的 "XCiPhoneOSCodeSignContext" 替換成"XCCodeSignContext"(共3處)

破解xcode無證書真機調試
破解xcode無證書真機調試
破解xcode無證書真機調試

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"

破解xcode無證書真機調試

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
           
破解xcode無證書真機調試

5.連接配接裝置(iphone/ipad)

點XCode右上角的Organizer圖示,然後選中你的裝置,在右邊視窗中點選“Use for Development” 即可,此時你的裝置名稱旁邊應該顯示黃色的小燈,重新拔插資料線,Organizer中會出現一個進度條,等這個進度條跑完,小燈就會變成綠色,開發模式已經啟用。

破解xcode無證書真機調試
破解xcode無證書真機調試

6.真機調試

破解xcode無證書真機調試

至此,真機調試應該是完成了

但是我的失敗了,報的錯是

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儲存的,忽略了權限的問題。

好了,問題解決了,果然跟網上各位前輩說的一樣,指令沒有執行成功,權限沒賦上的原因,這個低級錯誤浪費了我相當長的時間,雖然這種情況極少發生,但還是想說出來供大家參考也給我自己一個提醒,謝謝各位前輩對我的幫助。