iOS —— 使用 Xcode 在越獄 iOS 設備上進行開發調試

  1. 目的
  2. iOS 設備的設置
  3. 生成私有簽名
  4. 設置 Xcode
    1. 告訴 Xcode 不需要簽名
    2. 告訴 Xcode 不用做簽發動作
    3. 指示 Xcode 使用私有簽名簽發 App
  5. 開始調試
  6. 補充

1 目的

開發 iOS 程序時,如果想要在真機上進行調試,開發者必須要付 99 美金的年費用來獲取蘋果公司的 iOS 開發者賬號。99 美金並不算貴,但對於只想練練手玩一玩 iOS 開發而不想在 AppStore 上發佈應用的程序員來說,這筆投資讓人有點糾結。
另一方面,iOS 越獄程序的開發調試通常使用命令行的 SDK 進行,如果可以利用 Xcode 集成開發環境提供的便利性在真機上調試,那對開發效率的提升是巨大的。
下面就將介紹在不申請 iOS 開發者賬號的情況下,如何使用 Xcode 在越獄的 iOS 設備上進行開發調試。

2 iOS 設備的設置

iOS 設備在安裝運行每一個 App 時都需要檢查其數字簽名。爲安全起見,蘋果公司只允許由蘋果官方授權的數字簽名簽過的 App 在真機上運行。讓我們先繞過這個限制:

  1. 越獄你的 iOS 設備。請自行放狗查找越獄教程
  2. 安裝越獄應用 AppSync。這需要在 Cydia 中添加源 http://cydia.hackulo.us , 然後選擇一個適合設備的 AppSync 版本下載安裝。這個應用能讓設備繞過蘋果的數字簽名驗證機制,從而安裝我們私有簽名簽發的 App (當然,也能安裝盜版 App,這不在討論範圍之內,請支持正版!)
  3. 重啓 iOS 設備

每次 iOS 操作系統升級都要在設備上重複該步驟。

3 生成私有簽名

你需要簽名來簽發 (codesign) App,這樣才能在 iOS 設備上運行。既然不想花 99 美金申請蘋果官方的開發者簽名,那就生成自己的私有簽名來簽發。
蘋果官方文檔有詳細的生成步驟https://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html:

  1. 打開 Mac OS X 操作系統自帶的 實用工具 中的 鑰匙串訪問 程序
  2. 在鑰匙串訪問程序的菜單中選擇 證書助理 -> 創建證書 …
  3. 證書的名稱一定要寫 “iPhone Developer”,以避免不必要的麻煩
  4. 身份類型爲 自簽名根證書 ,證書類型選 代碼簽名
  5. 勾選 讓我覆蓋這些默認值 並繼續
  6. 隨便輸入一個的序列號。保證序列號和證書名稱唯一就可以了
  7. 輸入證書信息,因爲是私有證書,隨便寫一下就行
  8. 後面選擇框都用默認值就好了

完成後你就可以在鑰匙串訪問中看到這個新創建的名爲 “iPhone Developer” 的自行簽名的根證書了。它被標紅警示 “此證書不被信任”,表示其並非權威機構認證生成的。這沒有關係,因爲我們在上一步已經搞定了 iOS 設備了。

該步驟只需一次。

4 設置 Xcode

我們需要告訴 Xcode 在編譯調試時既不需要簽名,也不用做自動的簽發動作。最後,還要指定 Xcode 使用上一步驟中生成的私有簽名來簽發 (codesign) 我們的程序。

4.1 告訴 Xcode 不需要簽名

因爲需要更改 Xcode 的配置文件,我們首先要關閉 Xcode,同時爲了安全起見,在修改配置文件之前都要備份原始文件。
以下的設置是以 Xcode 4.3 和 iOS SDK 5.0 爲例。其它的版本的 Xcode 和 iOS SDK 的路徑略有不同,請自行對應修改。

cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/
sudo cp Info.plist Info.plist.orig
sudo vi Info.plist

找到

<<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">key</span>>CODE_SIGNING_REQUIRED</<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">key</span>>
<<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">string</span>>YES</<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">string</span>>

將 YES 改爲 NO。
再找

<<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">key</span>>ENTITLEMENTS_REQUIRED</<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">key</span>>
<<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">string</span>>YES</<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">string</span>>

也將 YES 改爲 NO

然後用同樣方法,先備份 /Developer/Platforms/iPhoneOS.platform/Info.plist 配置文件,然後修改其中所有的

<<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">key</span>>CODE_SIGN_CONTEXT_CLASS</<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">key</span>>
<<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">string</span>>XCiPhoneOSCodeSignContext</<span style="padding: 0px; margin: 0px; color: rgb(255, 100, 0);">string</span>>

替換其中的 XCiPhoneOSCodeSignContext 爲 XCCodeSignContext

最後,我們要修改 Xcode 中的 iPhone 開發的 plugin

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 "\xc3\x26\x00\x00" >> working
mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support

這樣,Xcode 就知道 iOS 的程序不需要簽名了。該步驟對每個新安裝的 Xcode 和 iOS SDK 版本都要做一遍。

4.2 告訴 Xcode 不用做簽發動作

打開任意的 Xcode 工程,選擇項目文件,在 Build Settings 中找到 Code Signing 項,選出 “Code Signing Identity” 中的子條目 “Any iOS SDK”,將它設置爲 “Don’t Code Sign”。

4.3 指示 Xcode 使用私有簽名簽發 App

新建並保存下面的 python 腳本:

[python] view plaincopy
  1. <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(128,128,128)"><em>#!/usr/bin/env python</em></span>  
  2.    
  3. <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>import</strong></span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">sys</span>  
  4. <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>import</strong></span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">struct</span>  
  5.    
  6. <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>if</strong></span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(0,128,0)">len</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">sys</span>.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">argv</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(102,204,102)">!</span>= <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,69,0)">3</span>:  
  7.     <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>print</strong></span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">"Usage: %s appname dest_file.xcent"</span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(102,204,102)">%</span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">sys</span>.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">argv</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">[</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,69,0)">0</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">]</span>  
  8.     <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">sys</span>.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">exit</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span>-<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,69,0)">1</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>  
  9.    
  10. APPNAME = <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">sys</span>.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">argv</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">[</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,69,0)">1</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">]</span>  
  11. DEST = <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">sys</span>.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">argv</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">[</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,69,0)">2</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">]</span>  
  12.    
  13. <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>if</strong></span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>not</strong></span> DEST.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">endswith</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">'.xml'</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>and</strong></span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>not</strong></span> DEST.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">endswith</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">'.xcent'</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>:  
  14.     <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>print</strong></span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">"Dest must be .xml (for ldid) or .xcent (for codesign)"</span>  
  15.     <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">sys</span>.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">exit</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span>-<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,69,0)">1</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>  
  16.    
  17. entitlements = <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">""" 
  18. <?xml version="1.0" encoding="UTF-8"?> 
  19. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
  20. <plist version="1.0"> 
  21. <dict> 
  22.     <key>application-identifier</key> 
  23.     <string>%s</string> 
  24.     <key>get-task-allow</key> 
  25.     <true/> 
  26. </dict> 
  27. </plist> 
  28. """</span> <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(102,204,102)">%</span> APPNAME  
  29.    
  30. f = <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(0,128,0)">open</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span>DEST,<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">'w'</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>  
  31. <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,119,0)"><strong>if</strong></span> DEST.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">endswith</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">'.xcent'</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>:  
  32.     f.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">write</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">"<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(0,0,153)"><strong>\x</strong></span>fa<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(0,0,153)"><strong>\x</strong></span>de<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(0,0,153)"><strong>\x</strong></span>71<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(0,0,153)"><strong>\x</strong></span>71"</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>  
  33.     f.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">write</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(220,20,60)">struct</span>.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">pack</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(72,61,139)">'>L'</span>, <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(0,128,0)">len</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span>entitlements<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span> + <span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:rgb(255,69,0)">8</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>  
  34. f.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">write</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span>entitlements<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>  
  35. f.<span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">close</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">(</span><span style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:black">)</span>  

假定腳本保存在 /Developer/iphoneentitlements401/gen_entitlements.py,將其設爲可執行

chmod 777 /Developer/iphoneentitlements401/gen_entitlements.py

最後,你必需在每一個需要實體設備調試的工程中指定運行該腳本。選中工程文件,在 Build Phases 頁中點擊右下角的 Add Build Phase 按鈕。在 Shell 框中輸入下面的 shell 腳本:

export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; 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

5 開始調試

打開設置好的 Xcode 工程,連上 iOS 設備。打開 Xcode 的 Organizer 面版,在左邊的 Device 列表中選中連接上的 iOS 設備,點擊 Use for Development,對彈出的對話框都選擇 “拒絕” 或 “Cancel”。
現在點擊 Run 按鈕,你就能在設備上運行你的程序了。
如果需要調試,你也可以切換到 Debug 版本: 選擇菜單 Product -> Edit Scheme … 將 Run YourAppName.app 中的 Build Configuration 改爲 “Debug”。
至此,你就可以免掉99美金的年費盡情的在真機上調試你的應用了。

6 補充

  • 本文的方案嚴重參考 http://www.alexwhittemore.com/developing-jailbroken-iphone-ios-401/ 向原作者致謝。
  • 該方案經驗證能在 Xcode 3 ~ 4, iOS 4 ~ 5 的版本上運行。不同版本的配置文件路徑有所不同,請自行修改。
  • 要在 AppStore 上發佈你的應用,99 美金的註冊年費是無論如何省不下來的。其實價格倒也公道,畢竟 Xcode 是免費的。
  • 如要正常的簽發流程,請用每一步驟中備份的原始配置文件進行恢復。警告! 本人還沒有恢復過,不能保證一定能成

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