新闻中心> 文章详情

iOS应用开发入门:Xcode免证书真机调试

2015年10月29日

  xcode是开发phone、ipad的必备开发工具,开发的程序可以通过xcode自带的iphone、ipad模拟器运行,但是不能把程序传到真实的设备上进行调试和运行。开发者必须购买99美元/年的开发账户,才能再真机上运行和调试程序,本文就是讲述如何通过破解xcode,使得用户可以不需要购买99美元开发账户,就能在真机上调试程序。


  注:运行程序的iphone或ipad必须要越狱,而且开发人员如果在appstore上发布程序,那就必须购买开发账户。


  1、创建个人证书(使用实用工具-钥匙串访问 命令创建,具体步骤在网上有很详细的介绍)。(非必要步骤)


  新建立的个人证书没有经过苹果认证,是不可信证书,因此在正常情况下,xcode不可能使用这个证书,所以必须对xcode进行破解才行。不过破解xcode之后,使用不可信的伪证书和不使用证书的效果一样的,因此这个步骤并不是必须的。


  2、修改Xcode的配置文件和二进制文件,破解xcode。南京iOS应用开发培训


  这是至关重要的步骤,对xcode进行破解,才能让其不使用证书或使用伪造证书向iphone上传和调试ios程序。


  保证Xcode处于关闭状态,命令行终端,复制粘贴下面的代码:


  #!/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 “\x8f\x2a\x00\x00″ >> working


  dd if=iPhoneOS\ Build\ System\ Support of=working bs=1 skip=127504 seek=127504


  /bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original


  /bin/mv working iPhoneOS\ Build\ System\ Support 南京iOS应用开发培训


  chmod a+x iPhoneOS\ Build\ System\ Support


  以上代码对support.xcplugin文件进行来修改。


  3、修改xcode的配置文件


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


  新增如下两项:


  PROVISIONING_PROFILE_ALLOWED = NO


  PROVISIONING_PROFILE_REQUIRED = NO


  ②替换“/Developer/Platforms/iPhoneOS.platform/Info.plist”文件部分单词:


  将所有“XCiPhoneOSCodeSignContext”替换为“XCCodeSignContext”


  4、打开xcode,修改具体项目的配置(此步骤以后在每次新建项目的时候都得进行)


  开启Xcode->然后打开自己的项目->菜单选择(Project>>Edit Project Setting)->选择“Build”面板->找到Code Signing Identity项,并将“Code Signing Identity”更改赋值。两种方法:


  1)如果你建立来伪造的证书“iPhone Developer”(名字可以随便起),这里就可以选择你建立证书的名字。


  2)如果没有建立证书,这里选择“Don't Code Sign”南京iOS应用开发培训


  5、建立Code Signing Entitlements文件。


  没有这个文件,虽然程序可以上传到iphone上运行,但是xcode不能调试iphone上的程序。


  建立Code Signing Entitlements有两种方法:


  1)方法一:利用脚本文件进行建立(注意,此方法我在实验时,没有成功,正在查找原因,添加的脚本没有执行)


  ①连接互联网后执行


  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


  注意:这里的新建立的目录iphoneentitlements401 名称可以随便起,但在后面脚本文件使用时需注意目录名称统一。


  ②添加自定义的生成脚本


  在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


  2)方法二:手工添加文件


  ①在工程中按照这个执行创建一个名为:Entitlement.plist 文件,具体方法是:打开 File Menu, 选择 New File -> iPhone OS -> Code Signing -> Entitlements. Name the file “Entitlements.plist" ,然后点击 ‘Finish’.


  ②打开 这个 “Entitlement.plist"文件,将 “Can be debugged”属性值改为 “YES”,将“get-task-allow”属性值改为“YES”。(建立的时候,默认好像就是YES)南京iOS应用开发培训


  ③将Code Signing Entitlements 那项的值改为刚刚新建得“Entitlements.plist".


  经过上述5个步骤,就可以在iphone上免证书,调试程序了。


  附1:生成IPA文件


  如果程序调试好了,怎么才能发给别人用呢?正常情况下IPA文件是从Xcode的Organizer中输出的,但是我们没有证书,这样输出会产生错误。我们只能用个小trick来完成这个操作了。


  先将代码生成为Release目标,然后打开工程的输出文件夹,通常情况下这个目录是


  /Users/你都用户名/Library/Developer/Xcode/DerivedData/以工程名打头的文件夹/Build/Products/Release-iphoneos


  这个目录下有个.app的文件,就是生成的程序了。把这个.app拖到iTunes中,它会出现在应用程序那个列表中,然后再把它从iTunes的那个列表中拖出来(比如拖到桌面),就变成.ipa了。


  附2: 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()


上一篇下一篇
按时发顺丰

技术交流群

Java大数据交流群560819979    加入
Python技术交流群595083299    加入
Oracle技术交流群595119011    加入
Web前端技术交流群604697610    加入
Huawei技术交流群482919361    加入
Redhat技术交流群587875348    加入
UI设计技术交流群511649801    加入
Cisco技术交流群596886705    加入
IT运维技术交流群605888381    加入