Xcode 4.2/4.3 免证书(iDP)开发+真机调试+生成ipa

Preface:
  本人的开发环境使用的是:Mac OS X Lion 10.7.3 + Xcode 4.2.1, 亲测有效。目前Xcode的最新版本是4.3.2, 集成了iOS5.1的SDK,并把Xcode弄到从App store安装了。看开发者评论都说不如以前的版本稳定,如果不是要开发5.1的程式,建议还是暂时使用Xcode 4.2.1。
  本文以Xcode4.2版本为例,也会给出4.3的相应破解办法(未经测试)。
  各步骤会标明版本,比如(Xcode4.1请执行),(Xcode4.2请执行)和(Xcode4.3请执行),4.2.1的修改方法与4.2完全相同,未标明的步骤为两个版本均需执行的步骤!

已经测试并证实有效的平台有
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(2012年2月7日更新)
iPhone 4S iOS 5.0.1(5A406)

另外,操作系统的版本貌似对调试影响不大,这期间用过的系统有Mac OS X 10.7~10.7.3,都没有问题。

当然您需要先越狱您的设备并通过Cydia安装Appsync
本文参考了多篇文章,综合其中的方法,并修正其中的错误,整理而成。

Referenced:
http://kqwd.blog.163.com/blog/static/4122344820117191351263/
http://hi.baidu.com/cqhg1981/blog/item/453497fc49ee2ce2fc037f03.html
http://laolang.cn/back-end-develop/helloworld-iphone-developer.html
http://ccmos.tw/blog/2011/06/30/xcode4-port-program-to-idevice-without-idp/
http://www.cnblogs.com/flyingzl/articles/2207717.html

WHO SHOULD READ THIS:
  在Xcode上开发的程序只能在模拟器中运行,如果要在真机上运行调试,需要花费99 dollors购买开发者证书iDP。对于初涉IOS的开发者或者仅仅闲暇写写小程序不打算发布到Appstore去赚dollor的爱好者,99美金显然不是个小数目。等IOS玩熟了,再去购买iDP也不迟。
  在没有iDP的情况下,要想将程序放到iPhone上调试,并最终发布IPA用于分享,需要以下几个步骤:
1.自己为自己颁发一个证书用于为生成的程序签名
2.修改工程配置以及Xcode的配置文件和二进制文件以阻止其验证和签名
3.通过自定义生成步骤,用伪造的证书为应用程序签名
4.使用一点小trick来生成IPA文件

BASE REQUIREMENTS:
1. 熟悉Shell的一些基本命令比如cd,cp,mv,chmod,sudo等,会使用vim或者其他文本编辑器。
2. 理解每个步骤的意义,在涉及到系统或者Xcode重要配置文件时,最好能做备份,以备将来逆向操作恢复原始文件。
3. 一部已经越狱并从Cyida安装了Appsync插件的IOS设备。

FOLLOW THE BELOW STEPS:
1.创建证书
  创建证书的过程比较简单,打开实用工具-钥匙串访问。然后在菜单栏里点击钥匙串访问-证书助理-创建证书来打开向导。第一个步骤比较重要,必须要把名称命名为iPhone Developer,将类型设定为代码签名,将"让我覆盖这些默认值"选中。之后的步骤无需更改,一路点击“确定”和“继续”来完成这个向导就可以。

2.修改Xcode的配置文件和二进制文件
  下面的操作请先将Xcode按Command+Q完全关闭。
(1)修改配置文件
进入目录并备份原文件(4.1、4.2、4.3在这里主要的差别是SDK的目录名不同)
(Xcode4.1请执行)

1
cd /Developer/Platforms/iPhoneOS .platform /Developer/SDKs/iPhoneOS4 .3.sdk/

(Xcode4.2请执行)

1
cd /Developer/Platforms/iPhoneOS .platform /Developer/SDKs/iPhoneOS5 .0.sdk/

(Xcode4.3请执行)

1
cd /Applications/Xcode .app /Contents/Developer/Platforms/iPhoneOS .platform /Developer/SDKs/iPhoneOS5 .0.sdk
1
2
sudo cp SDKSettings.plist SDKSettings.plist.orig // 备份
sudo vim SDKSettings.plist // 用vim进行编辑

将以下两段中的YES改为NO

1
2
< key >CODE_SIGNING_REQUIRED</ key >
< string >YES</ string >

1
2
< key >ENTITLEMENTS_REQUIRED</ key >
< string >YES</ string >

下面修改另外一个文件
进入目录并备份原文件
(Xcode4.1/4.2请执行)

1
cd /Developer/Platforms/iPhoneOS .platform/

(Xcode4.3请执行)

1
cd /Applications/Xcode .app /Contents/Developer/Platforms/iPhoneOS .platform
1
2
sudo cp Info.plist Info.plist.orig // 备份
sudo vim Info.plist // 用vim进行编辑

将全部的XCiPhoneOSCodeSignContext修改成XCCodeSignContext(Xcode 4.2/4.3有三处)。
(2)二进制补丁
#建立一个crack脚本

1
2
cd ~ /Desktop
vim crack

#(Xcode 4.1执行)在编辑器中输入如下内容

1
2
3
4
5
6
7
#!/bin/bash
cd /Developer/Platforms/iPhoneOS .platform /Developer/Library/Xcode/Plug-ins/iPhoneOS \ Build\ System\ Support.xcplugin /Contents/MacOS/
dd if =iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "xc3x26x00x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support

#(Xcode 4.2执行)在编辑器中输入如下内容

1
2
3
4
5
6
7
#!/bin/bash
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 "xc3x26x00x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support

保存并退出。(4.1和4.2在这里的区别也是目录名不同,就是代码中绿色的部分。4.1是Plug-ins而4.2是PrivatePlugIns)
授予这个脚本执行权限并执行它

1
2
chmod +x crack
. /crack

正常的话应该输出(具体的数字可能有差别)

1
2
3
231+1 records in
231+1 records out
115904 bytes transferred in 0.001738 secs (66694555 bytes/sec)

#(Xcode 4.3注意)在Xcode 4.3版本中,我没有找到iPhoneOS Build System Support.xcplugin这个插件,因此我跳过了这个步骤,并且最终也成功的进行了联机调试。因此我个人认为Xcode 4.3没有必要执行“二进制补丁”这一步骤。

至此,对SDK中配置文件和二进制文件的修改就完成了

3.准备自定义的生成后脚本
  连接互联网后执行
#(Xcode 4.1/4.2执行)

1
2
3
4
5
mkdir /Developer/iphoneentitlements401
cd /Developer/iphoneentitlements401
curl -O http: //www .alexwhittemore.com /iphone/gen_entitlements .txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py

#(Xcode 4.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

如果你没有互联网连接(囧,那你也不可能看到本篇文章了),那么请在相应目录手动创建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 :
print "Usage: %s appname dest_file.xcent" % sys.argv[ 0 ]
sys.exit( - 1 )
                                                                                                                                           
APPNAME = sys.argv[ 1 ]
DEST = sys.argv[ 2 ]
                                                                                                                                           
if not DEST.endswith( '.xml' ) and not DEST.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/>
</dict>
</plist>
""" % APPNAME
                                                                                                                                           
f = 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()

4.修改工程设置
  特别注意:本阶段之前的修改配置文件、准备脚本等,只需要做一次。但本阶段的操作,对每个需要真机调试的工程都要做一遍。
这个步骤的主要作用是支持真机调试,如果不做这个步骤,仍然可以通过步骤5来生成ipa在真机上运行,但是无法使用Xcode内置的调试器对在真机上运行的程序进行单步跟踪。如果您的程序在点击Run真机调试时秒退,请检查此步骤是否正确完成。
(1)禁用Xcode自动的签名操作
将工程配置中所有的Code Signing选项全部设为Don't Code Sign,如图。可能需要先点击“All”让这个选项显示出来

(2)添加自定义的生成后脚本
在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,输入以下脚本
(对于Xcode 4.1/4.2)

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

(对于Xcode 4.3)

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

如图所示:

至此配置全部完成,下面就可以插上iPhone,重新选择生成目标来测试一下在线调试了!如果是第一次使用该设备调试,请先在Organizer中将设备切换为开发模式,具体操作请见常见问题5。

5.打包应用程序,生成ipa文件
  如果我的程序调试好了,怎么才能发给别人用呢?正常情况下IPA文件是从Xcode的Organizer中输出的,但是我们没有证书,这样输出会产生错误。我们只能用个小trick来完成这个操作了。
在Xcode上选择Product菜单,选择Build For -> Build for Achiving,然后打开工程的输出文件夹,通常情况下这个目录是
/Users/你的用户名/Library/Developer/Xcode/DerivedData/以工程名打头的文件夹/Build/Products/Release-iphoneos


这个目录下有个.app的文件,就是生成的程序了。把这个.app拖到iTunes中,它会出现在应用程序那个列表中


再把它从iTunes的那个列表中拖出来(比如拖到桌面),你就得到.ipa了!
然后你就可以把你的程式分享给你的朋友了。

Troublesome Shooting:
请严格按照文中的方法操作,下面列出常见问题(2011年12月14日)
1. 程序运行时报错,或者根本不能通过编译。错误信息类似(感谢博友rinzeng提出)
ARC forbids explicit messsage send of 'release'
'release' is unavailable: not available in automatic reference counting mode
解答:这个错误与本文讨论的问题无关,即使在模拟器上运行也照样会报错。但我愿意在这里予以解答。这个错误是由在iOS 5中最新引进的ARC内存管理机制造成的。解决方法有2种,一是不要加release语句。二是在Build Settings中关闭Objective-C Automatic Reference Counting

2. 各种错误,错误信息中包含“No such file or directory”这句话
解答:错误信息的含义非常清楚,就是“没有这个文件或者目录”。这类错误通常是由于您拷贝代码时不全或者开发环境安装错误等问题导致的。请再次检查报错的目录是否存在,检查代码与本文给出的是否严格一致,各种检查吧~总之是低级错误

3. 联机调试时程序秒退,或者无法安装到设备,或者任何时候报错,错误信息中包含“code sign”、“CERT”或者“certificate”字样的(最常见的错误!!)
解答:证书错误或者签名错误,这种问题就不要问了,肯定是因为您没有严格文中的步骤做。提醒您检查的地方有(1)有没有设置为Don't Code signing (2)生成后事件的代码是否已经正确粘贴 (3)那个Python脚本是否已经成功执行
其中最可能出问题的就是生成后事件代码(文中的那个Run Script)没有正确执行。可能是您忘记了添加Run Script并粘贴那段代码,也可能是您没复制全,或者复制到了啥特殊字符导致执行出错。查看那个script的执行结果的方法是在Xcode左侧的侧边栏里,点最靠右的一个标签(Show the Log navigator),看最近的一个Build日志(不是Debug日志),找到一行Run custom shell script "Run Script"那一行,正常情况下那一行跟其他行一样,是不能展开的。如果那一行左边有个小箭头,点击后能展开的话,说明执行出错,展开后的信息即为出错的信息。请认真查看错误信息并修正脚本中的错误。如果Build日志里根本没有Run custom shell script "Run Script",那说明您忘记添加Build script了。。。(2012年2月9日更新)

4. iPad能用吗?
解答:我没有iPad,所以没法准确回答。但从热心博友的回复来看,iPad无疑是可以用的。
如果要用ipad 需要把第四步脚本文件里的 platform_name == iphones 换成platform_name == ipads 不然会报错的~ (感谢博友xyishao的建议)
感谢qingcheng89提出的改进意见,现在来看上述代码可以直接支持iPad而无需修改,请各位朋友测试。(2012年2月9日更新)

5. 为什么我的Build for Archiving选项是灰色的?
解答:是因为您没有把设备插到电脑上。虽然这个问题挺蠢的,但我曾经也有过这个疑问,哈哈~~
经热心网友xc7296815提醒,设备未开启开发模式也会导致Build for Archiving不可用,开启开发模式的方法是:插上设备,点Xcode右上角的Organizer图标,选中您的设备,在右边窗口中点击“Use for Development” (2011年12月25日)

6.我的iOS版本/Xcode版与你的不同,能用吗?
解答:我只在iPod Touch 4 + iOS 4.3.3 & 5.0 + Xcode 4.1/4.2上测试可用,在iPhone 4和iPad上虽未测试,但根据网友的反馈是可用的。其他环境我没有测试过,也没有条件测试,因此当您的环境与我的不同时,别问我可不可用,您可以试一下,然后把结果告诉我,也为其他的网友提供方便,在此先谢谢您了!

7.真机调试时出现Error launching remote program: failed to get the task for process xxx错误(2012年1月26日更新)
解答:我在调试中貌似没有遇到过这个问题,但是不少网友指出会有这个问题,谁来告诉我什么情况下会出这个问题呢?如果您遇到了这个问题,请阅读Apple官方的帮助文档http://developer.apple.com/library/ios/#qa/qa1710/_index.html
2012年2月1日更新:有网友指出该错误是由于权限设置错误导致的。由于我使用了跟报错的那位网友完全相同的环境,而在操作过程中并没有遇到这个错误,所以基本可以确定是您没有按步骤操作造成的,请您再次检查整个过程,尤其是热心网友提出的下载脚本并修改执行权限的部分。
经本人测试,如果该错误出现在编译运行之后,且现象为设备上的程序闪退,则是由于签名错误导致的,这是由于您没有严格按照上述步骤来做导致的,请参考常见问题3.(2012年2月9日更新)

xcode4.3 构建ipa包发布到iphone相关推荐

  1. ipa包发布App Store

    如果你开发的APP想要让用户在iOS上使用,那么唯一的办法就是上App Store,当然TestFlight除外,但没人愿意用个测试版还得去下个TestFlight去用吧.所以还是看下怎么上传到App ...

  2. win10上ipa包安装到iPhone手机上的方法

    指路https://blog.csdn.net/xiaopei_yan/article/details/111986117

  3. iOS 自动化发布 Fastlane 本地构建 IPA 并分发

    此篇文章相关代码已经上传至 GitHub,相关代码请移步 build_ios_app iOS 自动化发布测试包到 fir.im,以及自动打包上传 AppStore 并提交审核... 公司项目都是在 J ...

  4. IPA 包不经过APP Store直接发布到网站供用户下载安装

    最近公司有需求,要把IOS客户端(IPA包)放到自己服务器上供用户下载,这样就能跳过APP Store 的审核. 准备条件 1.IOS 开发包 即IPA文件. 2.Plist文件. 3.https服务 ...

  5. Win7+虚拟机OS X 10.8.5+Xcode4.6.3+越狱iPhone4+iOS5.1.1真机调试及生成ipa包

     20160108:Win7下Unity iOS开发环境搭建 0.先前已经搭好虚拟机OS X 10.8.5+Xcode4.6.3环境,原生iOS App也已经能真机调试了. 1.将Unity4.3. ...

  6. iPhone 直接安装 .ipa包

    有些App因为各种原因,不能直接通过App Store下载到,以前是可以在网上找到.ipa文件通过iTunes直接安装的.但是现在的版本已经不支持了. 官方的工具不好用,只好用民间的了.我们在电脑上下 ...

  7. gitlable iphone_使用gitlab ci构建IOS包并发送通知消息到企业微信

    在之前的文章中,我们介绍了使用gitlab ci构建Android包的方法.今天我们介绍使用gitlab ci如何构建IOS包,并且在打包成功或者失败时,如何将消息通知到企业微信. 如果对gitlab ...

  8. 把ipa包上传入AppStore

    由于苹果的机制,在非越狱机器上安装应用必须通过官方的Appstore,开发者开发好应用后上传Appstore,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传App ...

  9. Xcode 12.1导出ipa包(适合新手)

    前言 因(生)工(活)作(所)需(迫)求,需要从Unity导出Xcode工程,接入IOS SDK,并导出ipa包供测试和上传应用到appStore.新手一枚记录一下导出ipa步骤,方便自己和大家学习. ...

最新文章

  1. HDD工作原理 导图
  2. Gin源码解析和例子——路由
  3. 使用pytorch构建图片分类器
  4. Kubernetes的未来是虚拟机?
  5. 算法复习——计算几何基础(zoj1081)
  6. 数学建模python教材推荐_数模竞赛专攻python应该准备什么?
  7. python数学公式pdf文件的转换_python转换文件 多种文件转换为pdf
  8. c++类的嵌套(1)
  9. VS单步调试的无法进入断点、行号错乱等问题解决方法
  10. Java中的堆栈API——Stack
  11. 【微信读书】《我不过低配的人生》- 雾拦满江 读书笔记
  12. macbook linux 双系统,Mac双系统切换及设置技巧
  13. 国内外优秀程序员的博客全在这了,请查收
  14. 骨传导耳机对听力有危害吗,骨传导耳机会不会伤害耳朵
  15. Symmetric 配置数据库同步
  16. 详解动态规划01背包问题--JavaScript实现
  17. STM32_光敏、温湿度传感的选择?
  18. 阿里云企业邮箱发送邮件失败,在本地测试可行,在云服务器上失败
  19. python模块名功能明和别名_Python模块及部分常见模块详解
  20. 企业运用人工智能的案例_如何打造企业私域流量及企业微信

热门文章

  1. SDUTOJ打字训练
  2. Allegro PCB Design GXL (legacy) - 设置旋转角度的快捷键
  3. SuperMap Desktop制作地图
  4. 集美大学第七届团体程序设计天梯赛第二场排位赛题解
  5. 手机照片删了怎么恢复
  6. 微信授权登录的多帐号问题
  7. 聊聊傅里叶变换的意义和定义
  8. 2022年产品经理考这个证书绝对超值(NPDP)
  9. 每天两分钟 远离电脑病
  10. Python编程语言好学吗? 零基础转行能学Python吗?