免iDP編譯iPhone app真機執行

因爲嘗試了很多資料.所以這篇不光是轉載了
我把所有嘗試方法和最終步驟都記錄下來.
網上的資料要不是少步驟要不就是太老
我在IOS SDK 4.1下面測試
環境是
Mac OS X 10.6.4
iPhone 1,1 whited00r 3.1.5(firmware 3.1.3)
iOS SDK 4.1 final

測試下來方法1和方法2都不能通過編譯
兩種方法結合起來也不行
後來找到方法3
使用方法3終於可以編譯通過.產生了release代碼
但是複製到iphone上之後只要執行就立刻退出
在ssh下面執行的時候直接返回Killed
查閱之後感覺是簽名還是有問題,被SpringBoard直接殺掉了
嘗試過在iPhone上執行ldid
但是返回如下的錯誤

codesign_allocate:for architecture armv6 object: ./test malformed object (unknown load command 4)
util/ldid.cpp(582): _assert(0:WEXITSTATUS(status)==0)

最終使用如下方法關閉iphone證書檢測
sysctl -w security.mac.proc_enforce=0
sysctl -w security.mac.vnode_enforce=0

==========================總結:真正運行自己的app過程=========================
1.iPhone安裝openssl以及openssh,這個方便以後連接上來操作.當然用91之類的文件管理也可以將編譯後的程序放上來

2.iPhone的ssh默認密碼是alpine,不要用passwd去改.直接修改/etc/passwd文件和備份.具體方法這裏不說了.

3.修改Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS[SDK版本].sdk/SDKSettings.plist文件,將CODE_SIGNING_REQUIRED對應的值設置爲NO.

4.打開項目,在Xcode右上角的info裏面,選擇Building項,Configuration選擇Release,在Code Signing->Code Signing Identity->Any iOS device設置爲Don’t Code Sign

5.這時候項目選擇Device就可以正常編譯通過了

6.將文件上傳,這裏使用scp,可以使用其他方法
mac$scp -r [項目名.app] root@[你的iphone的IP地址]/Applications

7.登錄iphone進行操作,給程序可執行權限並且重啓SpringBoard讓程序圖標可以出現.
mac$ssh root@[你的iphone的ip地址]
iphone$cd /Applications
iphone$chmod +x [項目名.app]
iphone$killall SpringBoard

8.關閉iphone的合法性檢查關閉
iphone$sysctl -w security.mac.proc_enforce=0
iphone$sysctl -w security.mac.vnode_enforce=0

9.執行程序成功

==========================總結:測試過程=========================
1.iPhone安裝openssl以及openssh,這個方便以後連接上來操作.當然用91之類的文件管理也可以將編譯後的程序放上來

2.iPhone的ssh默認密碼是alpine,不要用passwd去改.直接修改/etc/passwd文件和備份.具體方法這裏不說了.

3.修改Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS[SDK版本].sdk/SDKSettings.plist文件,將CODE_SIGNING_REQUIRED對應的值設置爲NO.

4.打開項目,在Xcode右上角的info裏面,選擇Building項,Configuration選擇Release,在Code Signing->Code Signing Identity->Any iOS device設置爲Don’t Code Sign

5.這時候項目選擇Device就可以正常編譯通過了

6.在Mac OS X中下載ldid,以下使用mac$標識在mac機執行的指令,iphone$標識在iphone中執行的指令
mac$wget http://svn.telesphoreo.org/trunk/data/ldid/ldid-1.0.610.tgz

7.解壓這個包並編譯
mac$tar -zxf ldid-1.0.610.tgz
mac$cd ldid-1.0.610
mac$g++ -I . -o util/ldid{,.cpp} -x c util/{lookup2,sha1}.c

8.進入[項目目錄]/build/Release-iphoneos/

9.使用ldid對應用程序進行簽名
mac$ldid -S [項目名.app]/[項目名]

10.將文件上傳,這裏使用scp,可以使用其他方法
mac$scp -r [項目名.app] root@[你的iphone的IP地址]/Applications

11.登錄iphone進行操作,給程序可執行權限並且重啓SpringBoard讓程序圖標可以出現.
mac$ssh root@[你的iphone的ip地址]
iphone$cd /Applications
iphone$chmod +x [項目名.app]
iphone$killall SpringBoard

12.在iphone上執行程序就直接退出了.

13.從手機的Cydia上搜索下載ldid,登錄ssh之後執行
iphone$ldid -S [項目名.app]/[項目名]
報錯

codesign_allocate:for architecture armv6 object: ./test malformed object (unknown load command 4)
util/ldid.cpp(582): _assert(0:WEXITSTATUS(status)==0)

14.從cydia的網站找到ldid官方的方法
只能將檢查關閉
iphone$sysctl -w security.mac.proc_enforce=0
iphone$sysctl -w security.mac.vnode_enforce=0

15.執行程序成功

==========================方法1:製作自己證書=========================
1. 產生證書
由於 XCode 後面的版本都要求應用程式必須經過簽署,也因此你必須要
多花99美元加入 Developer Program (真是黑呀),反正我又不放到 App Store 賣錢,乾脆自己簽個證書來用不就好了

打開 Key Access 這個工具程式(在應用程式->工具程式內),並建立一個 “iPhone Developer” 名稱的證書(這個名稱不要改,否則你得在專案內改變)

類型選擇”編碼簽名”
輸入憑證資訊
最後選擇存放在”系統”內(不是 “登入”,否則會找不到)
這樣就大功告成了,你已經省下$99了!

2. 專案建立好了後,打開 Project Setting,並在 User-Defined Settings 輸入:
PROVISIONING_PROFILE_ALLOWED = NO
PROVISIONING_PROFILE_REQUIRED = NO

3. 打開 Info.plist,這個檔案主要存放應用程式的相關描述,按右鍵 Add Row,新增 SignerIdentity = “Apple iPhone OS Application Signing” (要一樣的,亂輸好像不行)

11. 選擇要使用的設備,在此我們選擇 Device – iPhone OS 2.2,XCode 會幫我們簽署,按下”允許”(不能按”總是允許”)就可以輸出到你的iPhone了(第一次跑可能會出現 Security policy error,再跑一次
就不會出現了)

==========================方法2:直接生成app=========================
開發安裝環境mac OS,並且有wifi,經過越獄(破解)的iphone或者ipod touch.
下面所提到的scp是mac OS的終端命令.
ssh,ldid 和chmod等是iphone的終端命令行,需要安裝,cydia等工具

直接進行編譯,必會出現錯誤提示:
CodeSign error: no certificate found in keychain for code signing identity ‘iPhone Developer’

下面我們先跳過Xcode的簽名檢查.打開工程文件夾下的*.xodeproj爲後綴名的文件(右鍵點擊顯示包內容”Show Package Contents”),一般會看到三個文件,以文本方式打開project.pbxproj這個文件,
此時, 打開工程文件夾下*.xcodeproj為後綴名的文件(右鍵點擊, 選擇”Show Package Contents”),搜索iPhone Developer,找到後刪除,一共有2處,然後保存,重新進入Xcode編譯即可生成App程序.生成的結果在build目錄下.

把編譯好的release for device的程序拷貝到iphone
先進入MyApp.app所在的目錄,然後執行如下命令
siu-andrewde-macbook:release-iphoneos siuandrew$ scp -r MyApp.app [email protected]:/Applications
提示輸入密碼
[email protected]′s password:
然後開始拷貝.

拷貝完成後再次登入Iphone:
siu-andrewde-macbook:release-iphoneos siuandrew$ ssh [email protected]
[email protected]′s password:
登入後執行簽名工作
iPhone:~ root# cd /Applications
iPhone:/Applications root# ldid -S MyApp.app/MyApp
ldid這一步非常重要,注意-S要大寫,耐心等待簽名結束.

簽名完成進行把整個目錄權限設置755
iPhone:/Applications root# chmod +x MyApp.app
設置權限這一步也必不可少,或者用chmod -R 755 MyApp.app

上傳及簽名工作完成,如果iphone 安裝了91關機助手,註銷並修復圖標即可,否則在iphone機子上要刪除installation.plist文件
iPhone:~ root# rm /private/var/mobile/Library/Caches/com.apple.mobile.installation.plist
然後重啓動手機即可看到程序的圖標.

運行你自編譯的App程序.

==========================方法3:不簽名app,使用ldid=========================

如果你不是iPhone開發者,但是恰好有mac和iphone在身邊,又恰好是個喜歡“hello world”的IT民工,那你一定會想在自己的iPhone上hello world一下。由於你只是玩票,所以肯定不會去弄iPhone Development Program ,官方文檔自然沒有任何供你參考的信息,目前網絡上介紹的各種sdk版本的方法大多都已經失效或是混亂,所以發一個簡單的說明:

本文測試環境:Snow leopard 10.6.3 + Xcode 3.2.2 + iPhone 3G(3.1.2固件)

前提條件:在Xcode中已經有可以在模擬器上正常運行的Hello World程序 + iPhone已經越獄 + 本身是個沒進行過iPhone開發的小白

方案思路:build一個不需要簽名的應用,在mac上用ldid僞造簽名,通過SSH上傳到iPhone上

操作步驟:
sudo vi /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS[SDK版本].sdk/SDKSettings.plist , 把CODE_SIGNING_REQUIRED對應的值設置爲NO。 – 這是告訴Xcode使用這個SDK build時不用必須簽名應用;
在Xcode中修改應用的”info”->”build” -> “Release” -> “Code Signing Identity”,設置爲”Don’t Code Sign”,選擇構建目標爲”iPhone Device – [SDK版本] | Release”,build應該提示無錯誤。(第一步的配置生效需要重啓Xcode) – 此步構建了一個沒有簽名的app,路徑爲[項目位置]/build/Release-iphoneos/HelloWorld.app
安裝ldid
wget http://svn.telesphoreo.org/trunk/data/ldid/ldid-1.0.610.tgz
tar -zxf ldid-1.0.610.tgz
cd ldid-1.0.610
g++ -I . -o util/ldid{,.cpp} -x c util/{lookup2,sha1}.c
util/ldid 下面就是我們需要用來僞造簽名的ldid程序了
給程序簽名
ldid -S [項目位置]/build/Release-iphoneos/HelloWorld.app/HelloWorld (注意這裏要寫到.app下面的執行文件)
SSH上傳到iPhone的/Applications 下面,respring一下就可以看到並使用HelloWorld應用了(SSH應該在大家越獄時都有裝,如果沒有,到Cydia或Rock中都能裝上,不會respring就重啓iPhone)

參考資料:

http://bbs.weiphone.com/read-htm-tid-222380.html

http://www.blogjava.net/sealyu/archive/2010/09/14/331968.html

http://blog.robaggio.net/2010/04/idpiphone.html

http://techxter.com/62/code-signing-iphone-applications-using-ldid/

http://www.saurik.com/id/8

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