搭建无iDP证书的Xcode环境

标签:iOS开发

众所周知,开发iOS应用需要注册iOS Developer Program(iDP)。不过这玩意需要99美元/年,只是玩玩而已的话就显得太贵了。好在不注册也可以用模拟器测试,但是不在iOS设备上测试总觉得不爽,于是便在网上找到了解决办法。

首先是必备条件:
  • 已越狱的iOS设备
  • Intel CPU的Mac,运行Mac OS X
  • Xcode + iOS SDK( 3.1.x需要Mac OS X 10.5或以上版本, 3.2.x需要Mac OS X 10.6或以上版本,我是用3.2.6)

满足上述条件后,运行“钥匙串访问”,创建一个名为“iPhone Developer”的自签名根证书。基本上都是默认设置,第一步需要把“覆盖这些默认值”打上勾,“已扩展的密钥使用扩展”那步需要改成“代码签名”。详细步骤可参见构建XCode免证书开发环境
最后会生成一个不被信任的证书,不过不用担心。

接着打开“/Developer/Platforms/iPhoneOS.platform/Info.plist”这个文件,把所有的“XCiPhoneOSCodeSignContext”替换成“XCCodeSignContext”(即删除iPhoneOS,共3处)。

2011年7月11日更新,解决无法调试的问题(来源《Xcode 3.2.1 and Jailbroken iPhone 3.1.2 is Build & Go!》):
再下载ldids,解压到/usr/local/bin文件夹,并保证有运行权限(需要输入root密码)。

最后打开“/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS Build System Support.xcplugin/Contents/Resources/iPhoneCodeSign.xcspec”这个文件,把“CommandLine”后的“/usr/bin/codesign”修改为“/usr/local/bin/ldid2”。


好了,破解结束,简单吧~

接下来测试一下破解效果。
运行Xcode,创建或打开一个项目,确认代码无误后把build选项改成“Device”,用数据线把你的iOS设备连到Mac上,然后按“Build and Run”按钮。
此时应该会弹出一个窗口,询问是否要用这个iOS设备来进行开发。此处当然要yes,之后会提示没证书什么的,不用管它直接取消掉。
取消以后就运行失败了,不用担心,手动选择collect,等待几分钟后这个iOS设备就能用于开发了,指示灯也从红色变成绿色了。

如果没有弹出这个窗口,就去Window菜单下找到Organizer,选中你的iOS设备,然后点“Use for Development”。
此时会提示需要收集信息,于是点“Collect”。接着还要输入管理员密码和IDP,那个IDP当然就取消掉不用管,等收集完就行了。

然后再“Build and Run”,此时Xcode左下角就会显示正在安装你的应用到iOS设备了,之后就不用再说了。

不过,像我这么杯具的人在最后一步还可耻地失败了,提示iOS的版本太低了。我的iPhone运行的是iOS 4.2.1,而用的iOS SDK是4.3,而iOS版本必须不低于iOS SDK的版本才行。
过了一天我才偶然发现,在“Project”-“Edit Project Settings”对话框的“Build”标签页里,有“iOS Deployment Target”这个选项,改成“iOS 4.2”或更低版本就行了。
而如果要联机调试的话,还需要在这个对话框中把“Other Code Signing Flags”改为“-gta”,并把“Build Active Architecture Only”打上勾(或者把“Architectures”改为“Optimized (armv7)”)。

顺便再提一下ARM。
“Build”标签页里的“Architectures”项可以选择“Standard (armv6 armv7)”和“Optimized (armv7)”。标准的为armv6和armv7各生成一份代码,而优化则只生成armv7的代码。
iOS设备使用ARM结构处理器,从iPhone 3GS、iPod 3和iPad开始支持armv7,之前的设备只支持armv6。因此,如果你的代码只含armv7,那么早期的设备就不能运行,但是生成的app尺寸会减小。
值得一提的是,iOS 4.3也不能装在这些早期的设备上,所以如果你的应用依赖iOS SDK 4.3或以后的API,那么放弃armv6也不会有损失。而需要注意的是,如果你要发布这个app到App Store,需要编辑项目的Info.plist,在“Required device capabilities”里加上“armv7”

关于ARM,还有3件与性能相关的事:
一是它没有整数除法指令,因此整数除法会被编译成一个系统函数调用。(准确来说,ARMv7-R和ARMv7-M支持,但iOS设备用的ARMv7-A不支持。)
二是Thumb指令集可以缩小代码尺寸,节约内存、缓存和代码带宽,因此“Compile for Thumb”是默认打开的。但Thumb只能访问部分寄存器,不能访问浮点硬件,因此浮点运算必须调用系统函数。而Quartz和Core Animation使用浮点坐标系,经常需要进行浮点运算,因此可以尝试禁用Thumb来改进性能。不过ARMv7可以使用Thumb 2指令集,它可以访问所有寄存器和浮点硬件,所以没有这些缺点。
三是GCC生成的ARM代码比较差,可以尝试使用LLVM编译器(把“C/C++ Compiler Version”改成“LLVM GCC 4.2”或“LLVM compiler 1.7” )。

最后说下如何生成ipa文件。
运行iTunes,选择“文件”-“添加到资料库⋯”,找到项目的build文件夹下的.app文件,然后点“选取”按钮,就会在资料库里自动生成一个ipa文件了。


2011年10月16日更新:
Xcode 4.2 + iOS SDK 5.0 on Mac OS X 10.7.2破解步骤(参考自《Xcode 4.1免证书(iDP)开发+真机调试+生成IPA全攻略》):

  1. 打开“/Developer/Platforms/iPhoneOS.platform/Info.plist”这个文件,把所有的“XCiPhoneOSCodeSignContext”替换成“XCCodeSignContext”(即删除iPhoneOS,共3处)。
  2. 打开“/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/SDKSettings.plist”这个文件,把CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED的值改为NO。
  3. 联网并运行下面的代码(只是下载并生成一个Python脚本,无危害):
    cd /Developer/
    curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
    mv gen_entitlements.txt gen_entitlements.py
    chmod 777 gen_entitlements.py
  4. 打开project的Build Settings,把所有的“Code Signing Identity”改为“Don't Code Sign”。
  5. 打开target的Build Phases,点右下角的“Add Build Phase”按钮,选择“Add Run Script”,输入这些代码:
    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
    /Developer/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

18条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?