Xcode 4.5.2 + iOS 6.0免證書(iDP)開發+真機調試+生成IPA全攻略


轉自:http://www.cnblogs.com/yuanxiaoping_21cn_com/archive/2012/11/15/2772388.html

操作系統:os x lion 10.7.4

xcode: 4.5.2

ios:6.0

參考文章:http://www.cnblogs.com/rywx/archive/2012/10/05/2712647.html

在沒有iDP的情況下,要想將程序放到iPhone上調試,並最終發布IPA用於分享,需要以下幾個步驟:
1.自己為自己頒發一個證書用於為生成的程序簽名
2.修改工程配置以及Xcode的配置文件和二進制文件以阻止其驗證和簽名
3.通過自定義生成步驟,用偽造的證書為應用程序簽名
4.使用一點小trick來生成IPA文件

 

1.創建證書
創建證書的過程比較簡單,打開實用工具-鑰匙串訪問。然后在菜單欄里點擊鑰匙串訪問-證書助理-創建證書來打開向導。第一個步驟比較重要,必須 要把名稱命名為iPhone  Developer,將類型設定為代碼簽名,將"讓我覆蓋這些默認值"選中。之后的步驟無需更改,一路點擊“確定”和“繼續”來完成這個向導就可以。

 

 

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
 
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分支下。

注:我在測試時使 用命行的方式打開xcode會報錯,所以先把這兩個plist文件復制到/libs目錄下,使用命令行修改了權根,使其可以修改,如

sudo cp ./Info.plist /libs/Info.plist

sudo chmod a+w /libs/Info.plist

sudo chmod 777 /libs/Info.plist

sudo chmod a+w /libs

sudo chmod 777 /libs

試試

然后用xcode打開/libs/Info.plist進行編輯,修改好保存再sudo cp /libs/Info.plist ./Info.plist

SDKSettings.plist也一樣

 

(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或4.5.2執行)在編輯器中輸入如下內容
#!/bin/bash
cd /Applications/Xcode.app/Contents/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/4.5.2執行)
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

 

如果您已經聯網,則請直接轉到步驟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”讓這個選項顯示出來

 

(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.5.2)
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
 
至此配置全部完成,下面就可以插上iPhone,重新選擇生成目標來測試一下在線調試了!如果是第一次使用該設備調試,請先在Organizer中將設備切換為開發模式,具體操作請見常見問題5。
 
5.旁門左道生成IPA文件
如果我的程序調試好了,怎么才能發給別人用呢?正常情況下IPA文件是從Xcode的Organizer中輸出的,但是我們沒有證書,這樣輸出會產生錯誤。我們只能用個小trick來完成這個操作了。
先將代碼生成為Release目標(步驟:Xcode4中,Product->Edit Scheme...
Destination改為iOS
Device, Run xxx.app的build configuration改為release。
),然后選中Product-》build for archiving
然后打開工程的輸出文件夾,通常情況下這個目錄是
/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日更新)
如果手機系統低於6.0,因為Xcode4.5默認使用只有iOS6才支持的 “auto layout” ,關閉detailview.xib的"auto layout"即可
 
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.(


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM