1. 程式人生 > >深入解析Xcode無證書編譯以及真機除錯

深入解析Xcode無證書編譯以及真機除錯

從標題就可以看出文章的主要內容了,一個是無證書編譯,另外一個則是真機除錯。網上關於此類文章很多,但是基本都是抄來抄去的,也沒一個詳細的說明具體這麼做的原因。並且配置的步驟也基本一致,沒什麼太大的區別。

對於第一部分來說,與網上的內容大體一致,也沒什麼奇怪的東西。簡單的說就是通過修改xcode的配置檔案來實現無證書即可編譯.app檔案。先說第一部分內容,步驟如下:

1. 執行Command+Q來徹底關係Xcode,修改/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer

/SDKs/iPhoneOS7.1.sdk/SDKSettings.plist

將以下兩個欄位修改為NO:

<key>CODE_SIGNING_REQUIRED</key><string>YES</string><key>ENTITLEMENTS_REQUIRED</key><string>YES</string>

1

2. 修改Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist將Info.plist中全部的XCiPhoneOSCodeSignContext 修改成 XCCodeSignContext,他們分別在DefaultProperties分支下、OverrideProperties分支下和RuntimeRequirements分支下。如果不進行此步,編譯Device Release版本時會報錯:

Code Sign error: a valid provisioning profile matching the application’s Identifier ‘com.yourcompany.xxxx’ could not be found

其實到這裡文章的第一部分就結束了,此時就可以建立新的專案或者對 原有的專案進行編譯了,但是在編譯的時候需要將Code Signing下面的簽名選項全部設定為Don’t Code Sign

2

如果這個時候將程式直接連線到越獄裝置上執行的時候雖然裝置上的應用會正常啟動,但是在啟動之後xcode卻會提示啟動應用失敗。出現這個錯誤則是由於偵錯程式無法正常的掛在啟動的程序,導致程序啟動之後啟動器卻認為程序啟動失敗了。要

修復這個錯誤其實也很簡單,只需要將Entitlement.plist檔案寫入到ipa中即可。對應的Entitlement.plist內容也非常簡單:

< ?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>get-task-allow</key>	<true></true></dict></plist>

最關鍵的就是這個plist中get-task-allow的選項,如果沒有這個選項那麼也就無法進行除錯了。建立該檔案之後還剩最後一步,就是將這個plist檔案重新寫回到ipa檔案中,這樣就可以進行除錯了。網上的指令碼比較複雜,基本上都是通過這個指令碼來生成.xcent的一個檔案:

#!/usr/bin/env import sysimport structif len(sys.argv) != 3:print "Usage: %s appnamedest_file.xcent" % sys.argv[0]sys.exit(-1)APPNAME = sys.argv[1]DEST = sys.argv[2]if not DEST.endswith('.xml') and notDEST.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></true></dict></plist>""" % APPNAMEf = 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()

生成的檔案會多一個application-identifier 欄位,這個欄位在二進位制檔案中有無並不影響程式的正常除錯。 要想將plist寫回到ipa檔案中需要用到xcode的codesign工具,切換到xode專案的Build Phases頁面,點選選單的Editor->Add Build Phase->Add Run Script Build Phase新增Run Script,輸入如下的內容:

codesign -fs "iPhone Developer" --entitlements="/Users/obaby/Entitlement.plist" "$BUILT_PRODUCTS_DIR/${WRAPPER_NAME}/$TARGETNAME"

引數說明:

“iPhone Developer” 簽名用的證書;

“/Users/obaby/Entitlement.plist” 上面的plist對應的路徑

“$BUILT_PRODUCTS_DIR/${WRAPPER_NAME}/$TARGETNAME” 生成的app檔案

3

這裡需要使用KeyChain Access 來建立一個子簽名用的證書,這個證書的建立網上說的非常詳細了,也就不多少了,不知道怎麼建立的可以參考這個連結:http://blog.csdn.net/lsqtzj/article/details/6533049

網上的指令碼是下面的內容:

exportCODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocateif [ "${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

這是因為這個指令碼要用上文提到的指令碼來建立xcent檔案用來簽名。我覺得沒這個必要,這個指令碼多新增的內容並沒有太多的用處,我覺得沒這個必要,這個指令碼多新增的內容並沒有太多的用處,並且這個指令碼使錯誤的,最後簽名的一行會直接導致簽名失敗,如果要用請參考上面的簽名修改 .所以還是簡單的辦法,只需要將我提供的那個plist儲存為檔案,找好目錄,然後新增一行bash命令就ok了。此時就可以既可以在模擬器上也可以在真機上進行除錯了。

模擬器除錯效果:

4

真機除錯效果:

5

最後簡單的說下如何打包IPA,從專案的Products下找到編譯生成的.app檔案,開啟iTunes,將生成的.app拖到iTunes中,此時iTunes會自動將.app打包成IPA。然後在iTunes中找到檔案右鍵在Finder中顯示就可以看到最終的IPA檔案了。

PDF下載: http://pan.baidu.com/s/1c0F4bhI

參考:http://iphonedevwiki.net/index.php/Xcode