如何使用Shell脚本编译生成Archive文件并导出签名IPA文件

作者&投稿:平雪 (若有异议请与网页底部的电邮联系)
如何重新签名ipa文件~

  准备
  在重签名之前要做一些准备工作。
  1.首先要下载并安装Xcode,里面有个codesign_allocate程序,在安装时/usr/bin中会多一个codesign的程序,该程序用于ipa包的签名。
  2.企业证书的Certificate文件,私钥文件,Provisioning Profile文件等。注意企业证书一定要是iOS Distribution的类型,不能是iOS Development。

  重签名步骤
  1.解压ipa
  解压ipa得到Payload/[App name].bundle,打开bundle。
  2.删除旧的ipa签名信息
  删除bundle中的_CodeSignature文件夹,也就是删除之前ipa的签名信息。
  3.更换证书
  将bundle中旧的Provisioning Profile删除,用我们自己的企业证书的Provisioning Profile替代。
  注意,要将ipa包中我们的企业证书改名为embedded.mobileprovision。
  4.修改bundle内容
  此时我们可以尽情地修改bundle中的内容,例如添加一个动态库,删除一张图片等。
  注意:如果要往bundle中添加动态库,必须要先将其压缩成zip文件,在程序启动时将其解压到Documents目录下再dlopen,否则程序在启动时加载动态库文件会卡死在那里。
  5.重新签名
  在完成bundle内容的修改后,需要通过/usr/bin/codesign程序重新签名,命令如下:
  /usr/bin/codesign -f -s "iPhone Distribution: YourCompanyName" --resource-rules Payload/ MYAPP.app/ResourceRules.plist Payload/ MYAPP.app
  其中iPhone Distribution可以从钥匙串访问中获取,就是企业证书的名字,例如下面的"iPhone Distribution:XXXXXXXXXX":



  具体的命令示例:
  codesign -f -s "iPhone Developer: XXXXXXXXXX" --resource-rules Payload/NdCP_Game_Demo.app/ResourceRules.plist Payload/NdCP_Game_Demo.app
  这条命令的意思是:使用keychain中"iPhone Developer: XXXXXXXXXX"标识的证书,根据Payload/NdCP_Game_Demo.app/ResourceRules.plist文件中的规则进行签名,如果ipa包中已经存在签名,那么将被替换,该过程生成的_CodeSignature目录将存放在Payload/NdCP_Game_Demo.app目录下。

  在命令执行后,在bundle中会生成一个新的_CodeSignature目录,里面包含了新的签名信息。

  6.重新打包成ipa
  在完成上述工作后,可以生成新的ipa进行发布。示例命令如下:
  zip -r ResignTest.ipa Payload
  # 注意Payload后面不能有“/”
  ‍
  7.发布
  经过打包发布测试,得出结论:对修改了ipa包内容和其中的签名后,重签名的ipa文件可以在非越狱设备和越狱设备上成功安装。注意,是通过带有SSL证书的网站和Apple系统安装的(企业内部分发程序),不是通过PP助手那样的第三方工具安装的。

可以试试这个脚本:webfrogs/xcode_shell · GitHub 下面两个也挺好用的 蒲公英:Pgyer.com - Free Publish APP|Free In-House Distribution|App Globle Testing FIR:Fly It Remotely

1. build 脚本说明
本Shell脚本用于build,XCode的workspace源代码工程,并导出成可重签名的IPA文件,用于分发测试安装文件和用于提交appstore审核的文件。实现辅助产品开发,测试的配置管理工作。
使用本脚本需要以下环境
- Mac OS 10.9+
- XCode 6.0 or later and command line tools
- 用于WorkSpace工程,例如使用了Cocoapods依赖库管理的工程
- *配置好开发证书和ad ho 证书(for Debug)和(for Release)
- 源代码工程中配置好Scheme名字和build
- 对Debug配置和Release配置设置好证书名称
- 确认在Xcode UI界面中能够完全build,并通过环境生成Archive和IPA,并正确签名。
- 在workspace文件夹下建立build文件夹
2. 复制脚本文件到WorkSpace目录
3. 打开终端工具,并进入workspace目录
4. 给脚本执行权限
chmod 777 ./build_one_target.sh
5. 修改脚本参数,源代码里已经有注释
需要修改的
workspace name
provisioningProfile
scheme name
build_config
代码块
代码块语法遵循标准markdown代码
#!/bin/bash

# init build configuration
# archive and ipa output path
build_path="./build"

# workspace name
build_workspace="workspacename.xcworkspace"

# project name and path
project_path=$(pwd)
project_name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')

# provisiong profile name
provisioningProfile='"XC Ad Hoc: com.xxxxxx.yyyyyy"'

# timestamp for ouput file name
timeStamp="$(date +"%Y%m%d_%H%M%S")"

echo "$project_path/$build_workspace"
if [ ! -d "$project_path/$build_workspace" ]; then
echo "Error!Current path is not a xcode workspace.Please check, or do not use -w option."
exit 2
fi

# get the info.plist

app_infoplist_path=${project_path}/${project_name}/${project_name}-AppStore-Info.plist
echo ${app_infoplist_path}

# get the main version
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${app_infoplist_path}")

# get the build version
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${app_infoplist_path}")

# get the svn revision
svn_revision=$(svn info |grep Revision: |awk '{print $2}')

#`svnversion -c |sed 's/^.*://' |sed 's/[A-Z]*$//'`
#svn info |grep Revision: |awk '{print $2}'

#workspace_name='*.xcworkspace'
#ls $project_path/$build_workspace &>/dev/null
#rtnValue=$?
#if [ !$rtnValue = 0 ];then
# #build_workspace=$(echo $(basename $project_path/$workspace_name))
# echo "Error!Current path is not a xcode workspace.Please check, or do not use -w option."
# exit 2
#fi

# scheme name
build_scheme="schemename"

# buidl config. the default is Debug|Release
build_config="Release"

# clean build
clean_cmd='xcodebuild'
clean_cmd=${clean_cmd}' clean -workspace '${build_workspace}' -scheme '${build_scheme}' -configuration '${build_config}
$clean_cmd > $build_path/clean_qa.txt || exit

# build & archive, generate the archive file
archive_name="targetname_QA_${timeStamp}.xcarchive"
archive_path="./build/"$archive_name

build_cmd='xcodebuild'
build_cmd=${build_cmd}' -workspace '${build_workspace}' -scheme '${build_scheme}' -destination generic/platform=iOS archive -configuration '${build_config}' ONLY_ACTIVE_ARCH=NO -archivePath '${archive_path}
echo "** Archiving QA ** to the ${archive_path}"
echo ${build_cmd}
$build_cmd > ./build/build_archive_qa.log || exit

if [ ! -d "${archive_path}" ]; then
echo "** Error! ARCHIVE QA FAILED ** Please check ./build/build_archive_qa.log."
exit 2
else
echo "** ARCHIVE QA SUCCEEDED ** to the ${archive_path}"
fi

# export to ipa with QA server
ipa_name="targetname_QA_adhoc_v${bundleShortVersion}_b${bundleVersion}_rev${svn_revision}_t${timeStamp}.ipa"
ipa_path="./build/"$ipa_name

ipa_cmd='xcodebuild'
ipa_cmd=${ipa_cmd}' -exportArchive -exportFormat ipa -archivePath '${archive_path}' -exportPath '${ipa_path}' -exportProvisioningProfile '${provisioningProfile}

echo "** Exporting QA ** to the ${ipa_path}"
echo ${ipa_cmd}
eval ${ipa_cmd} > ./build/export_ipa_qa.log || exit

if [ ! -f "${ipa_path}" ]; then
echo "** Error! Export IPA QA FAILED ** Please check ./build/export_ipa_qa.log."
exit 2
else
echo "** Export IPA QA SUCCEEDED ** to the ${ipa_path}"
fi
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100

6. 执行脚本
./build_one_target.sh
大一些的工程,大约3-5分钟完成。
完成之后,在workspace目录下的build目录下,会有如下两个主要文件。
targetname_QA_20150420_094731.xcarchive
targetname_QA_adhoc_v2.1.1_b44_rev7849_t20150420_094731.ipa
xcarchive文件很重要,可以用于不同证书签名的ipa文件
ipa文件使用的是adhoc 证书导出,用于真机测试分发。证书名称在源代码中配置。根据不同的产品bundle id,做相应修改,这里的名称和证书,仅做演示参考,不具有任何商业意义。


Linux系统中如何用shell脚步判断是否telnet成功。
1、连接上相应的linux主机,进入到等待输入shell指令的linux命令行状态下。2、在linux命令行下输入shell指令:telnet 192.168.120.209。3、最后,按下回车键执行shell指令,此时会看到telnet并没有连接成功。

如何运行shell脚本
1、首先使用软件登录到l虚拟机;2、使用命令查看当前路径为目录;3、通过命令赋予该脚本执行权限;4、否则没有执行权限表示在全路;5、表示在当前路径下执行该脚本;6、指定这种执行脚本方式的命令;7、接着不需要添加路径就能执行;8、最后命令添加进系统变量即可。

shell脚本是什么意思?
Shell脚本语言相对来说是比较容易学习的,因为它使用的是基于unix系统的命令行环境,因此只需要在终端中输入一些命令,就可以很快上手。Shell脚本还具有很好的可移植性,只要操作系统是unix或类unix系统,就可以使用Shell脚本。Shell脚本还可以帮助开发者提升工作效率,因为使用Shell脚本可以将一些反复的、机械的...

什么是 Shell 脚本?
Shell脚本是非编译语言,直接执行文本文件中的命令。例如,创建名为test.sh的脚本,首先需指定执行环境,如#!\/bin\/bash,然后输入命令如pwd和ls。注释有助于脚本的可读性和理解。要执行脚本,需要先使用chmod命令赋予执行权限(chmod+x),然后通过.\/脚本名的方式运行,如.\/test.sh。脚本会显示当前目录...

如何编写一个shell脚本
等来编写我们的shell程序。 程序必须以下面的行开始(必须方在文件的第一行): #!\/bin\/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用\/bin\/sh来执行程序。 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: chmod +x filename 然后,您可以通过输入: ...

Linux Shell脚本系列教程:Shell入门
编写脚本通常使用某种基于解释器的编程语言。shell脚本本质上就是一些文本文件,我们可以将一系列需要执行的命令写入其中,然后通过shell来执行。在这里我们介绍的是Bash shell(Bourne Again Shell),它是目前大多数GUN\/Linux系统默认的shell环境。书中所有的实验都是在Ubuntu14.04 LTS环境下完成的。二、基本...

Linux ShellShell 的使用
Shell同样具备脚本编程的能力。称为shell脚本的命令文件,由一系列列在文件中的命令构成。用户可以在文本编辑器中编写这些脚本,或者在命令行直接操作,利用UNⅨ命令和基本的编程结构,如变量定义、条件判断和循环。重要的是,shell负责解释脚本中的每一行,就像用户直接输入一样。然而,理解这些命令的功能至...

Windows7系统怎么运行linux shell脚本
当我们在使用过程中,由于工作需要可能会碰到linux下进行执行shell的脚本,而就会使用shell的脚本,但是经常使用windows7系统的用户就想要在电脑中直接进行shell的脚本,那么Windows7系统怎么运行linux shell脚本呢?现在为大家分享一下具体的操作方法如下。推荐:1、首先windows7系统电脑中需要安装的是git的应用...

如何在windows下使用linux的shell脚本
1、安装cygwin,包含shell脚本的命令,能执行bash命令,2、如果是perl或者python就安装相应的程序 3、有个ubuntu on windows,可以安装bash 在windows上,例如

如何在windows下使用linux的shell脚本
1、首先运行cmd,在cmd命令提示符执行bash命令。2、然后找到要执行的脚本文件执行即可。下图执行了一个t.sh的脚本文件。二、对于windows10之前的版本,可以借助于vmware、virtualpc等虚拟机来安装linux虚拟机,从而实现linux脚本的执行。三、除了安装虚拟机外,也可以安装windows上的linux模拟环境,比如cygwin...

孝义市18930532870: 怎样用ar命令将库文件释放到指定路径下 -
愈薇山梨: 用途说明 创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到.关于Linux下的库文件、静态库、动态库以及怎样创建和使用等相关知识,参见本文后面的...

孝义市18930532870: 如何使用Shell脚本编译生成Archive文件并导出签名IPA文件 -
愈薇山梨: 使用Shell脚本编译生成Archive文件并导出签名IPA文件.1. build 脚本说明本Shell脚本用于build,XCode的workspace源代码工程,并导出成可重签名的IPA文件,用...

孝义市18930532870: 在windows中怎样运行shell脚本来编译程序 -
愈薇山梨: 首先电脑中需要安装的是git的应用程序,安装完成之后,可以在开始菜单进行查看. 并需要配置好git的bin,配置环境变量,把bin的绝对路径复制到环境变量中path. 配置git的环境变量之后,在任意文件进行创建一个为mkdir.sh,文件名可以是随意的结.

孝义市18930532870: 在linux下,怎样编译java? -
愈薇山梨: Linux下java环境变量设置的完整步骤:从java.sun.com上下载JDK的安装文件,一般是jdk1.5.0_10_XXXX.bin的格式. 解开生成JDK目录,这里假设JDK安装在/usr/java/jdk1.5.0_10中: 代码:sudo chmod 755 jdk1.5.0_10_XXXX.bin sudo ./jdk1....

孝义市18930532870: 如何在windows下使用linux的shell脚本 -
愈薇山梨: 你好:首先,在你编辑shell脚本的时候调用系统内的shell,比如bash或csh等;第二,在编辑完成自己的脚本后,文件名可以以sh为结尾,如xx.sh,但是不是必须的;第三,给脚本文件赋予可执行的权限,可执行的前提是要有可读的权限;最后,在命令模式下直接用./xx.sh即可;

孝义市18930532870: 如何运行shell脚本 -
愈薇山梨: 编写好的shell脚本(如:test),可以采取两种方式进行运行:一、 $ sh test 一般不采用这种调用方式,尤其不采用“sh<test”的调用方式,因为这种方式将禁止shell读取标准输入.也可以采用 $ ksh test 这种方式要求shell具有“可读”的访问权...

孝义市18930532870: Java在linux上调用shell脚本 -
愈薇山梨: 用.sh 脚本call 第一不会超时的,第二只要你后台call进去了,就算前台超时了 后台还是一直在执行 建议把你的java program打包成jar 直接call 你的jar 包 列子#!/bin/bashjava -cp ./config:/activation.jar:/axis.jar:test.jar com.Test.run param1,param2-cp 是你文件 path config 是你配置文件放置位置, jar 和 sh script 同一级目录(可以根据你具体自己修改) 最后只是你需要run 的class了, 在class 里面去call 你对应的procedure

孝义市18930532870: 如何建立和执行shell脚本文件? -- 基于linux -
愈薇山梨: shell文件就是一个文本文件,用任意编辑器编辑均可 编译完成之后,给文件增加执行权限,使用chmod +x 然后就可以执行了,如果你的脚本不在系统PATH中指定的目录中,使用绝对路径或者相对路径调用即可

孝义市18930532870: 如何使用shell脚本一键编译 -
愈薇山梨: /可执行程序名 由于安全原因,PATH环境变量不包括当前目录,因此要执行在当前目录下的程

孝义市18930532870: linux shell脚本如何启动一个java进程 -
愈薇山梨: 在shell里面直接调用即可. 1,编译一个java文件为a.class. 2,编写shell脚本b .sh .#!/bin/bash java a.class 3,放在同一目录下运行shell即可.如果要后台运行,bash b.sh&

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网