天天看點

Xcode 4.1/4.2/4.3/4.3.2 + iOS 5.1.1免證書(iDP)開發+真機調試+生成IPA全攻略

原創文章,歡迎分享;未經許可,不得轉載;版權所有,侵權必究 開發環境使用的是目前為止最新的穩定版軟體: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)

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

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

當然您需要先越獄您的裝置并通過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. 本文給有一定基礎的朋友看,各種指令是免不了的。UNIX中的基本指令比如cp,mv,cd,chmod,sudo啥的還有vim編輯器,如果您都沒聽說過,強烈建議您不要嘗試本文提到的修改。一旦改錯了輕則Xcode挂掉,重則系統崩潰。 2. 本文的每一個步驟都是必須的,如果您哪一步沒有得到預期的結果,請不要繼續,以免發生更加意外的事情。。。 3. 如果遇到解決不了的問題歡迎留言詢問,務必給出詳細的錯誤資訊,否則無法判斷。部落客恕不解答類似于如何執行腳本代碼,如何賦予執行權限,如何使用vim編輯器(如何儲存)等與iOS開發無關的UNIX基礎問題。

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

Xcode 4.1/4.2/4.3/4.3.2 + iOS 5.1.1免證書(iDP)開發+真機調試+生成IPA全攻略

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

sudo cp SDKSettings.plist SDKSettings.plist.orig 進行編輯 sudo vim SDKSettings.plist 将以下兩段中的YES改為NO <key>CODE_SIGNING_REQUIRED</key> <string> YES </string> 和 <key>ENTITLEMENTS_REQUIRED</key> <string> YES </string>

下面修改另外一個檔案 進入目錄并備份原檔案 (Xcode4.1/4.2請執行)cd /Developer/Platforms/iPhoneOS.platform/ (Xcode4.3/4.3.2請執行)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鍵是搜尋下一處。

(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注意)在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.3.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

熱心網友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/4.2/4.3/4.3.2 + iOS 5.1.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.3.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

如圖所示:

Xcode 4.1/4.2/4.3/4.3.2 + iOS 5.1.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. 程式運作時報錯,或者根本不能通過編譯。錯誤資訊類似(感謝博友rinzeng提出) ARC forbids explicit messsage send of 'release' 'release' is unavailable: not available in automatic reference counting mode 解答:這個錯誤與本文讨論的問題無關,即使在模拟器上運作也照樣會報錯。但我願意在這裡予以解答。這個錯誤是由在iOS 5中最新引進的ARC記憶體管理機制造成的。解決方法有2種,一是不要加release語句。二是在Build Settings中關閉Objective-C Automatic Reference Counting

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版與你的不同,能用嗎? 解答:我隻在iPod Touch 4 + iOS 4.3.3 & 5.0 + Xcode 4.1/4.2上測試可用,在iPhone 4和iPad上雖未測試,但根據網友的回報是可用的。其他環境我沒有測試過,也沒有條件測試,是以當您的環境與我的不同時,别問我可不可用,您可以試一下,然後把結果告訴我,也為其他的網友提供友善,在此先謝謝您了!

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日更新)

文章好長...歡迎各路大俠指正。