您的位置:首页 > 其它

破解xcode无证书真机调试

2013-07-29 13:07 405 查看
参考网上各位前辈的做法,操作中遇到一些问题,也遇到了跟前辈的描述有出入的地方,所以写个文章记录下我的操作过程,如果有朋友恰巧与我遇到同样的问题,希望能有所帮助。

环境:

mac os 10.8

xcode 4.6

已经越狱的iPhone,ios 5.1.1

1)打开 Finder->应用程序->实用工具 -> 钥匙串访问
2)单击:"钥匙串访问"选择 "证书" 再选择"创建证书"过程如下图:

























2.修改xcode配置文件

1)修改SDKsettings.plist文件
点击桌面,顶部菜单栏点击前往,选择前往文件夹,输入路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
将目录下的SDKSettings.plist文件复制一份,默认名称为SDKSettings副本.plist
打开SDKSettings副本.plist,把CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED的值改成NO



将SDKSettings.plist文件重命名为SDKSettings.plist.bak,将SDKSettings副本.plist重命名为SDKSettings.plist
2)修改Info.plist文件

点击桌面,顶部菜单栏点击前往,选择前往文件夹,输入路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/
将目录下的Info.plist文件复制一份,默认名称为Info副本.plist
打开Info副本.plist,空白处右键单击选择Add Row,增加两项:
PROVISIONING_PROFILE_ALLOWED 值为 NO
PROVISIONING_PROFILE_REQUIRED 值为 NO



3)将上面Info副本.plist文件中的 "XCiPhoneOSCodeSignContext" 替换成"XCCodeSignContext"(共3处)







3.创建脚本文件gen_entitlements.py并赋予权限

注:如果你的电脑联网了,那么执行1)的命令后会在相应的目录自动创建iphoneentitlements文件夹及其下的gen_entitlements.py文件,如执行后没有生成指定文件,请重复执行下面的命令或者换第二种方法,两种生成脚本文件的方法任选一种。
1)在终端执行如下命令:

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

sudo chmod 777 gen_entitlements.py


2)上面的命令执行成功之后,会在/Applications/Xcode.app/Contents/Developer/目录下生成一个iphoneentitlements文件夹和其下的gen_entitlements.py文件,如果你的电脑没有联网或者不能自动生成相关目录文件,那么需要手动在相应的目录创建指定的文件,随后需要给gen_entitlements.py设置权限。
gen_entitlements.py脚本文件的内容如下:
#!/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()


在终端给gen_entitlements.py设置权限(可能会要你输入密码)
sudo chmod 777 /Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py
4.修改项目属性

1)点击项目图标,找到"Build Settings"选项下的"Code Sign Identity",将其值全部改为"Don't Code Sign"


2)切换到Build Phases选项,点击右下角的Add Build Phase,然后单击Add Run Script,然后在Run Script中输入以下脚本:

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




5.连接设备(iphone/ipad)
点XCode右上角的Organizer图标,然后选中你的设备,在右边窗口中点击“Use for Development” 即可,此时你的设备名称旁边应该显示黄色的小灯,重新拔插数据线,Organizer中会出现一个进度条,等这个进度条跑完,小灯就会变成绿色,开发模式已经启用。





6.真机调试



至此,真机调试应该是完成了

但是我的失败了,报的错是

env: python\r: No such file or directory

/Users/xx/Library/Developer/Xcode/DerivedData/test-glumoxjzztqvstbbrqyydevjiubv/Build/Products/Debug-iphoneos/test.app/test.xcent: cannot read entitlement data

从csdn下载频道下载了个文档,按照文档把脚本,也就是Build Phases里的脚本改成了

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


再运行,不报错了,但是真机里还是闪一下就退出了

之后又下载了ios 5.1的模拟器,模拟器运行成功过一次(不知道为什么只有这一次成功了),再在真机上运行又报错CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 5.1'

经过无数次尝试之后,还是老样子,不是报错就是闪退,无可奈何之下,下载了xcode 4.4,因为xcode 4.4带的是sdk5.1,跟我的真机系统版本是一样的,当时猜想也许是sdk的原因

重复上面的操作,还是报cannot read entitlement data的错误。

经过多天的折磨一直不能解决,只好周末回家继续,没想到回家只是重复执行了一遍步骤3里的第一种方法就可以真机调试了,真是喜出望外。

回想在单位不成功的原因,可能是由于单位的网络设置了代理,当时我的操作过程是这样的:执行步骤3的第一种方法,貌似一切顺利,并没有报错,执行完后打开gen_entitlements.py文件,文件内容是502 Bad Gateway之类的一堆英文,再手动把步骤3里第二种方法的代码粘贴到gen_entitlements.py文件,这一步中就出现了一个小问题,用文本编辑器打开gen_entitlements.py文件并修改后不能保存,提示没有权限,但是用xcode却可以保存,当时我就直接用xcode保存的,忽略了权限的问题。

好了,问题解决了,果然跟网上各位前辈说的一样,命令没有执行成功,权限没赋上的原因,这个低级错误浪费了我相当长的时间,虽然这种情况极少发生,但还是想说出来供大家参考也给我自己一个提醒,谢谢各位前辈对我的帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: