zoukankan      html  css  js  c++  java
  • Xcode 4.1/4.2 免证书(iDP)开发+真机调试

    开发环境使用的是目前为止最新的稳定版软件:Mac OS X Lion 10.7 + Xcode 4.1

    各步骤会标明版本,比如(Xcode4.1请执行)和(Xcode4.2请执行)

    未标明的步骤为两个版本均需执行的步骤!

    当然您需要先越狱您的设备并通过Cydia安装AppSync

    众所周知,在Xcode上开发的程序只能在模拟器中运行,如果要放到真机上则要花费99美金购买开发者证书iDP。这严重阻碍了我等草根开发者探索的脚步。写个小程序,同学间分享一下这个小小的愿望都不能满足,自然不能善罢甘休。

    在没有iDP的情况下,要想将程序放到iPhone上调试,并最终发布IPA用于分享,需要以下几个步骤:

    1.自己为自己颁发一个证书用于为生成的程序签名

    2.修改工程配置以及Xcode的配置文件和二进制文件以阻止其验证和签名

    3.通过自定义生成步骤,用伪造的证书为应用程序签名

    4.使用一点小trick来生成IPA文件

     

    开始之前的友情提示:

    1. 本文给有一定基础的朋友看,各种命令是免不了的。UNIX中的基本命令比如cp,mv,cd,chmod,sudo啥的还有vim编辑器,如果您都没听说过,强烈建议您不要尝试本文提到的修改。一旦改错了轻则Xcode挂掉,重则系统崩溃。

    2. 本文的每一个步骤都是必须的,如果您哪一步没有得到预期的结果,请不要继续,以免发生更加意外的事情。。。

    3. 如果遇到解决不了的问题欢迎留言询问,务必给出详细的错误信息,否则无法判断。

     

    1.创建证书

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

     

    2.修改Xcode的配置文件和二进制文件

    下面的步骤稍微有点繁琐,您应该了解UNIX命令行的基本操作,并了解一种命令行文本编辑器,本文使用的是vim。尽管这里会给出完整的代码,但是关于修改和保存代码的基本操作,不再赘述。下面的操作请先将Xcode按Command+Q完全关闭

    (1)修改配置文件

    进入目录并备份原文件(4.1和4.2在这里主要的差别是SDK的目录名不同)

    (Xcode4.1请执行)

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

    (Xcode4.2请执行)

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

    保存文件,并使用vim进行编辑:

    sudo cp SDKSettings.plist SDKSettings.plist.orig
    sudo vim SDKSettings.plist

    将以下两段中的YES改为NO:

    <key>CODE_SIGNING_REQUIRED</key>
    <string>YES</string>

    <key>ENTITLEMENTS_REQUIRED</key>
    <string>YES</string>

    下面修改另外一个文件,进入目录并备份原文件,然后进行编辑:

    cd /Developer/Platforms/iPhoneOS.platform/
    sudo cp Info.plist Info.plist.orig
    sudo vi Info.plist

    将全部的XCiPhoneOSCodeSignContext 修改成 XCCodeSignContext,网上的大部分文章说有2处,但我找到了3处,可能是Xcode 4.1要多一处?(Xcode 4.2也有三处)总之都改掉了。提示:在在vim中输入/要搜索的内容来搜索,按n键是搜索下一处。

    (2)二进制补丁

    在桌面上建立script这个脚本:

    cd ~/Desktop
    vim script

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

    
    

    #!/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执行)在编辑器中输入如下内容:

    #!/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

    授予这个脚本执行权限并执行它

    chmod 777 script
    ./script

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

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

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

     

    3.准备自定义的生成后脚本

    连接互联网后执行

    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

    如果您已经联网,则请直接转到步骤4,如果您没有联网,那么请手动创建/Developer/iphoneentitlements401/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()

    4.修改工程设置

    特别注意:本阶段之前的修改配置文件、准备脚本等,只需要做一次。但本阶段的操作,对每个需要真机调试的工程都要做一遍。

    这个步骤的主要作用是支持真机调试,如果不做这个步骤,仍然可以通过步骤5来生成ipa在真机上运行,但是无法使用Xcode内置的调试器对在真机上运行的程序进行单步跟踪。如果您的程序在点击Run真机调试时秒退,请检查此步骤是否正确完成。

    (1)禁用Xcode自动的签名操作

    将工程配置中所有的Code Signing选项全部设为Don't Code Sign,如图。可能需要先点击“All”让这个选项显示出来

    (2)添加自定义的生成后脚本

    在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,

    输入以下脚本

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

    至此配置全部完成,下面就可以插上iPhone,选择测试设备进行真机调试了。

    参考的文章有:

    http://kqwd.blog.163.com/

    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

  • 相关阅读:
    linux 查看磁盘空间大小
    CSS里常见的块级元素和行内元素
    bootstrap改变上传文件按钮样式,并显示已上传文件名
    深度剖析:PHP中json_encode与json_decode
    2016 版 Laravel 系列入门教程
    支付宝私钥和公钥的生成方法
    iOS企业包安装注意事项详解(解决提示iPhone未受信任的问题)
    libevent的入门学习-库的安装【转】
    ibevent 和 libev 提高网络应用性能【转】
    libevent学习笔记 一、基础知识【转】
  • 原文地址:https://www.cnblogs.com/foxmin/p/2395359.html
Copyright © 2011-2022 走看看