天天看點

[iOS] Xcode 5 + iOS 7免證書(iDP)真機調試與生成IPA全攻略

衆所周知,在Xcode上開發的程式隻能在模拟器中運作,如果要放到真機上則要花費99美金購買開發者證書iDP。這嚴重阻礙了我等草根開發者探索的腳步。寫個小程式,同學間分享一下這個小小的願望都不能滿足,自然不能善罷甘休。

在沒有iDP的情況下,要想将程式放到iPhone上調試,并最終釋出IPA用于分享,需要以下幾個步驟:

1.自己為自己頒發一個證書用于為生成的程式簽名

2.修改工程配置以及Xcode的配置檔案和二進制檔案以阻止其驗證和簽名

3.通過自定義生成步驟,用僞造的證書為應用程式簽名

4.使用一點小trick來生成IPA檔案

開發環境使用的是目前為止最新的穩定版軟體:Mac OS X Lion 10.9.2 + Xcode 5

目前本人已經測試并證明有效的平台有:

•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

•iPhone 4S iOS 5.0.1(5A406)

•Xcode 4.3.2

•iPhone 4S iOS 5.1.1

•Xcode 4.4.1 for Mountain Lion

•iPhone 4S iOS 5.1.1

•Xcode 4.5 for Mountain Lion

•iPhone 4S iOS 5.1.1

•Xcode 4.6 for Mountain Lion

•iPhone 4S  iOS 6 .1

另外,作業系統的版本貌似對調試影響不大,這期間用過的系統有Mac OS X 10.6~10.9.2,都沒有問題。當然您需要先越獄您的裝置并通過Cydia安裝AppSync。

1. 建立證書

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

[iOS] Xcode 5 + iOS 7免證書(iDP)真機調試與生成IPA全攻略

2. 修改Xcode的配置檔案

下面的步驟稍微有點繁瑣,您應該了解UNIX指令行的基本操作,并了解一種指令行文本編輯器,本文使用的是vim。盡管這裡會給出完整的代碼,但是關于修改和儲存代碼的基本操作,不再贅述。下面的操作請先将Xcode按Command+Q完全關閉。

1. 進入iPhone SDK目錄

[Asm]  純文字檢視  複制代碼 ?

1

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/

不同版本的Xcode隻是最後的版本号不同。在Xcode 5.0中是iPhoneOS7.0.sdk,未來版本可能版本高一些,早期版本的就低一些。這個請大家自己改動。

2.備份原檔案 [Asm]  純文字檢視  複制代碼 ?

1

sudo cp SDKSettings.plist SDKSettings.plist.orig

3.編輯配置檔案

在不同版本的Xcode中,這個配置檔案的編碼方式并不相同。有的版本是XML格式,有的版本則是二進制格式的。為了友善修改,我們可以直接用Xcode打開這個檔案。首先要打開這個檔案所在目錄: [Asm]  純文字檢視  複制代碼 ?

1

open.

在彈出的Finder視窗中輕按兩下SDKSettings.plist,會啟動Xcode的圖形界面,我們展開DefaultProperties分支,将下面的CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED兩個屬性改為NO

4.編輯另外一個配置檔案

[Groovy]  純文字檢視  複制代碼 ?

1

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform sudo cp Info.plist Info.plist.orig open .

在彈出的Finder視窗中輕按兩下打開Info.plist。将全部的XCiPhoneOSCodeSignContext修改成XCCodeSignContext,共有3處。分别在DefaultProperties分支下、RuntimeRequirements分支下和OverrideProperties分支下。

至此,對SDK中配置檔案的修改就完成了

3. 準備自定義的生成後腳本連接配接網際網路後執行 [Asm]  純文字檢視  複制代碼 ?

1 2 3 4 5

mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements

cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements

curl -O [url]http://www.alexwhittemore.com/iphone/gen_entitlements.txt[/url]

mv gen_entitlements.txt gen_entitlements.py

chmod 777 gen_entitlements.py

熱心網友指出,這裡可能涉及到權限問題。我做的時候貌似沒有出啥問題,如果您在執行這段代碼時遇到Permission denied提示的話,請将相應的語句前面加上sudo以擷取超級權限。

如果您已經聯網,則請直接轉到步驟4,如果您沒有聯網,那麼請在相應目錄手動建立gen_entitlements.py并授予其執行權限,這個檔案的内容為:

[Asm]  純文字檢視  複制代碼 ?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

#!/usr/bin/env python

import

sys

import

struct

if

len(sys.argv) != 3:

trueprint

"Usage: %s appname dest_file.xcent"

% sys.argv[0]

truesys

.exit

(-1)

APPNAME = sys.argv[1]

DEST = sys.argv[2]

if

not

DEST.endswith(

'.xml'

)

and

not

DEST.endswith(

'.xcent'

):

trueprint

"Dest must be .xml (for ldid) or .xcent (for codesign)"

truesys

.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>

true<key>application-identifier</key>

true<string>%s</string>

true<key>get-task-allow</key>

true<true/>

</dict>

</plist>

""

" % APPNAME

f = open(DEST,

'w'

)

if

DEST.endswith(

'.xcent'

):

truef.write(

"\xfa\xde\x71\x71"

)

truef.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”讓這個選項顯示出來

[iOS] Xcode 5 + iOS 7免證書(iDP)真機調試與生成IPA全攻略

2.添加自定義的生成後腳本

在Build Phases中添加一個Build Phase,輸入以下腳本 [Asm]  純文字檢視  複制代碼 ?

1 2 3 4 5 6 7 8 9

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,要在Editor菜單下的Add Build Phase項中添加,Build Phase,如圖:

[iOS] Xcode 5 + iOS 7免證書(iDP)真機調試與生成IPA全攻略

對于Xcode 4,在右下角的“加号”處添加,如圖: 

[iOS] Xcode 5 + iOS 7免證書(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發給朋友,大家就可以跟您一起分享這個程式了。

[b][size=4]6.答疑解惑[/size][/b]

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”字樣的(最常見的錯誤)

解答:證書錯誤或者簽名錯誤,肯定是因為您沒有嚴格文中的步驟做。提醒您檢查的地方有:

•第一步中的plist檔案是否已經正确修改

•有沒有設定為Don’t Code signing

•生成後事件的代碼是否已經正确粘貼

•那個Python腳本是否已經成功執行

•裝置是否已經越獄并安裝AppSync

•第一步的iPhone Developer證書是否已經正确建立

其中最可能出問題的就是生成後事件代碼(文中的那個Run Script)沒有正确執行。可能是您忘記了添加Run Script并粘貼那段代碼,也可能是您沒複制全,或者複制到了啥特殊字元導緻執行出錯。檢視那個腳本執行結果的方法是在Xcode左側的側邊欄裡,點最靠右的一個标簽(Show the Log navigator),看最近的一個Build日志(不是Debug日志),找到一行Run custom shell script “Run Script”那一行,正常情況下那一行跟其他行一樣,是不能展開的。如果那一行左邊有個小箭頭,點選後能展開的話,說明執行出錯,展開後的資訊即為出錯的資訊。請認真檢視錯誤資訊并修正腳本中的錯誤。如果Build日志裡根本沒有Run custom shell script “Run Script”,那說明您忘記添加Build script了。。。

Run Script經常報的一條錯誤是“replacing existing signature”。。。這個提示的意思是“替換已有的簽名”,出現這個提示的原因是,你并沒有成功的阻止Xcode使用預設的方法為應用程式簽名。因為這個破解的原理就是阻止Xcode為app簽名,而用script中的自定義過程手動為app簽名。當script為app簽名時,發現app已經被Xcode簽名過了,就會報這個錯誤。出這個錯誤後提醒您檢查的地方有兩個

•SDKSettings.plist中需要修改的地方是否已經正确修改

•工程設定裡是否将那5個簽名的選項全部設為Don’t Code signing

4.iPad能用嗎?

解答:上述所有步驟無需修改可直接用于iPad開發。

5.為什麼我的Build for Archiving選項是灰色的?

解答:是因為您沒有把裝置插到電腦上。或者裝置未開啟開發模式。開啟開發模式的方法是:插上裝置,點Xcode右上角的Organizer圖示(在Xcode 5中,點選Window菜單下的Organizer項),選中您的裝置,看一下裝置名稱左側的小燈是什麼顔色的。若是灰色代表未開啟開發模式。此時在右邊視窗中點選“Use for Development”即可。若是黃色請重新插拔裝置,若是綠色代表裝置已經開啟開發模式

點選Use for Development後,會要求輸入Apple ID,這裡點選取消即可。這時啟用裝置開發模式的程序會立即終止。裝置名稱旁邊應該有一個黃燈。此時重新插拔裝置,Organizer中會出現一個進度條),等這個進度條跑完,小燈就會變成綠色,開發模式已經啟用。

最近經常有人提問說,無論怎麼搞,Organizer中的燈始終是黃色的。這種情況幾乎可以百分之百的确定是您的Xcode版本不夠高。如果您的裝置是iOS 5.1.1,則必須使用Xcode 4.3.2或以上版本。同樣的道理,iOS 5.0.1對應Xcode 4.3.1,iOS 5.0對應Xcode 4.3……

6.我的iOS版本/Xcode版與你的不同,能用嗎?

解答:本人測試過的環境和裝置已經在文章開頭給出。其他環境我沒有測試過,也沒有條件測試,是以當您的環境與我的不同時,别問我可不可用,您可以試一下,然後把結果告訴我,也為其他的網友提供友善,在此先謝謝您了!

7.真機調試時出現Error launching remote program: failed to get the task for process xxx錯誤

解答:如果該錯誤出現在編譯運作之後,且現象為裝置上的程式閃退,則是由于簽名錯誤導緻的,這是由于您沒有嚴格按照上述步驟來做導緻的,請參考常見問題3。