code_tin

免iDP编译iPhone app真机执行
因为尝试了很多资料.所以这篇不光是转载了 我把所有尝试方法和最终步骤都记录下来. 网上的资料要不是少步骤要不就是太...
扫描右侧二维码阅读全文
15
2010/09

免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 root@192.168.0.2:/Applications
提示输入密码
root@192.168.0.2's password:
然后开始拷贝.

拷贝完成后再次登入Iphone:
siu-andrewde-macbook:release-iphoneos siuandrew$ ssh root@192.168.0.2
root@192.168.0.2'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

Last modification:November 26th, 2018 at 04:16 pm
If you think my article is useful to you, please feel free to appreciate

3 comments

  1. Allen

    多谢LZ的文章,搜了一晚上终于找到一个4.1SDK可用的

    谢谢了!

  2. someone

    谢谢,致敬。
    对于不搞appstore,临时搞个小东西自己玩的,idp真是一个问题。
    这几天试试看看。

  3. lee

    感谢楼主的文章,最近我也在准备买iphone4然后做开发,但是手头比较紧所以,想先用楼主的方法测试一下.希望有更多后续文章

Leave a Comment