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

原文地址: http://kuangqi.me/ios/ios-development-without-idp/

衆所周知,在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,將類型設定爲代碼簽名,將”讓我覆蓋這些默認值”選中。之後的步驟無需更改,一路點擊“確定”和“繼續”來完成這個嚮導就可以。

2. 修改Xcode的配置文件

下面的步驟稍微有點繁瑣,您應該瞭解UNIX命令行的基本操作,並瞭解一種命令行文本編輯器,本文使用的是vim。儘管這裏會給出完整的代碼,但是關於修改和保存代碼的基本操作,不再贅述。下面的操作請先將Xcode按Command+Q完全關閉。

  1. 進入iPhone SDK目錄

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

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

  2. 備份原文件

    1
    
    sudo cp SDKSettings.plist SDKSettings.plist.orig
    
  3. 編輯配置文件

    在不同版本的Xcode中,這個配置文件的編碼方式並不相同。有的版本是XML格式,有的版本則是二進制格式的。爲了方便修改,我們可以直接用Xcode打開這個文件。首先要打開這個文件所在目錄:

    1
    
    open .
    

    在彈出的Finder窗口中雙擊SDKSettings.plist,會啓動Xcode的圖形界面,我們展開DefaultProperties分支,將下面的CODE_SIGNING_REQUIREDENTITLEMENTS_REQUIRED兩個屬性改爲NO

  4. 編輯另外一個配置文件

    1
    2
    3
    
    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. 準備自定義的生成後腳本

連接互聯網後執行

1
2
3
4
5
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

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

如果您已經聯網,則請直接轉到步驟4,如果您沒有聯網,那麼請在相應目錄手動創建gen_entitlements.py並授予其執行權限,這個文件的內容爲:

1
2
3
4
5
6
7
8
9
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”讓這個選項顯示出來

  2. 添加自定義的生成後腳本
    在Build Phases中添加一個Build Phase,輸入以下腳本

    1
    2
    3
    4
    5
    
    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,如圖:

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

    至此配置全部完成,下面就可以插上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發給朋友,大家就可以跟您一起分享這個程序了。

6. 答疑解惑

  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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章