背景:项目进入快速迭代期,需要快速地交付出AdHoc版本和企业无线发布版本。每次打包都要来回切换bundle identifier和code signing,浪费很多时间。

示例项目名称名称为TestOneKeyPublish。

  • xcode设置:

1、假设默认的target(即TestOneKeyPublish)用作个人开发者证书的AdHoc发布和平时的联机调试使用,这样,TestOneKeyPublish就设置为个人开发证书的bundle identifier和code signing。步骤略。接下来添加新的target,用作企业无线发布。

2、在xcode的Project面板,在Targets中选中TestOneKeyPublish,Duplicate出一个新的target,默认名称为TestOneKeyPublish copy。

3、将新target的名字修改成TestOneKeyPublishEnterprise。现在在Xcode的Toolbar的scheme中应该会有一个TestOneKeyPublish copy的新scheme。是的,名字看起来很没有特色。接下来我们统一命名。

4、选择“Manage Scheme...”,在里面删除TestOneKeyPublish copy,保存后,回到主界面选择“New Scheme...”,在”Target“栏中选择刚改名的TestOneKeyPublishEnterprise,“Name”栏填写“TestOneKeyPublishEnterprise”。在新的target,即“TestOneKeyPublishEnterprise”的Build Settings中搜索Product Name,修改名字为TestOneKeyPublishEnterprise。这样就完成了命名的统一。

5、既然要用作企业无线发布,当然需要修改TestOneKeyPublishEnterprise这一target的bundle identifier和code signing为企业证书的appID和provisioning profile。步骤略。

  • 自动打包脚本设置:

GitHub上下载xcode_shell,拿到“ipa-build”脚本,内容如下:

 #!/bin/bash

 #--------------------------------------------
# 功能:编译xcode项目并打ipa包
# 使用说明:
# 编译project
# ipa-build <project directory> [-c <project configuration>] [-o <ipa output directory>] [-t <target name>] [-n] [-p <platform identifier>]
# 编译workspace
# ipa-build <workspace directory> -w -s <schemeName> [-c <project configuration>] [-n]
#
# 参数说明:-c NAME 工程的configuration,默认为Release。
# -o PATH 生成的ipa文件输出的文件夹(必须为已存在的文件路径)默认为工程根路径下的”build/ipa-build“文件夹中
# -t NAME 需要编译的target的名称
# -w 编译workspace
# -s NAME 对应workspace下需要编译的scheme
# -n 编译前是否先clean工程
# -p 平台标识符
# 作者:ccf
# E-mail:ccf.developer@gmail.com
# 创建日期://
#--------------------------------------------
# 修改日期://
# 修改人:ccf
# 修改内容:打包方式改为使用xcrun命令,并修改第二个参数
#--------------------------------------------
# 修改日期://
# 修改人:ccf
# 修改内容:采用getopts来处理命令参数,并增加编译前清除选项
#--------------------------------------------
# 修改日期://
# 修改人:ccf
# 修改内容:增加编译workspace的功能
#-------------------------------------------- if [ $# -lt ];then
echo "Error! Should enter the root directory of xcode project after the ipa-build command."
exit
fi if [ ! -d $ ];then
echo "Error! The first param must be a directory."
exit
fi #工程绝对路径
cd $
project_path=$(pwd) #编译的configuration,默认为Release
build_config=Release param_pattern=":p:nc:o:t:ws:"
OPTIND=
while getopts $param_pattern optname
do
case "$optname" in
"n")
should_clean=y
;;
"p")
tmp_optind=$OPTIND
tmp_optname=$optname
tmp_optarg=$OPTARG OPTIND=$OPTIND-
if getopts $param_pattern optname ;then
echo "Error argument value for option $tmp_optname"
exit
fi
OPTIND=$tmp_optind platform_id=$tmp_optarg ;;
"c")
tmp_optind=$OPTIND
tmp_optname=$optname
tmp_optarg=$OPTARG
OPTIND=$OPTIND-
if getopts $param_pattern optname ;then
echo "Error argument value for option $tmp_optname"
exit
fi
OPTIND=$tmp_optind build_config=$tmp_optarg ;;
"o")
tmp_optind=$OPTIND
tmp_optname=$optname
tmp_optarg=$OPTARG OPTIND=$OPTIND-
if getopts $param_pattern optname ;then
echo "Error argument value for option $tmp_optname"
exit
fi
OPTIND=$tmp_optind cd $tmp_optarg
output_path=$(pwd)
cd ${project_path} if [ ! -d $output_path ];then
echo "Error!The value of option o must be an exist directory."
exit
fi ;;
"w")
workspace_name='*.xcworkspace'
ls $project_path/$workspace_name &>/dev/null
rtnValue=$?
if [ $rtnValue = ];then
build_workspace=$(echo $(basename $project_path/$workspace_name))
else
echo "Error!Current path is not a xcode workspace.Please check, or do not use -w option."
exit
fi ;;
"s")
tmp_optind=$OPTIND
tmp_optname=$optname
tmp_optarg=$OPTARG OPTIND=$OPTIND-
if getopts $param_pattern optname ;then
echo "Error argument value for option $tmp_optname"
exit
fi
OPTIND=$tmp_optind build_scheme=$tmp_optarg ;;
"t")
tmp_optind=$OPTIND
tmp_optname=$optname
tmp_optarg=$OPTARG OPTIND=$OPTIND-
if getopts $param_pattern optname ;then
echo "Error argument value for option $tmp_optname"
exit
fi
OPTIND=$tmp_optind build_target=$tmp_optarg ;; "?")
echo "Error! Unknown option $OPTARG"
exit
;;
":")
echo "Error! No argument value for option $OPTARG"
exit
;;
*)
# Should not occur
echo "Error! Unknown error while processing options"
exit
;;
esac
done #build文件夹路径
build_path=${project_path}/build
#生成的app文件目录
appdirname=Release-iphoneos
if [ $build_config = Debug ];then
appdirname=Debug-iphoneos
fi
if [ $build_config = Distribute ];then
appdirname=Distribute-iphoneos
fi
#编译后文件路径(仅当编译workspace时才会用到)
compiled_path=${build_path}/${appdirname} #是否clean
if [ "$should_clean" = "y" ];then
xcodebuild clean -configuration ${build_config}
fi #组合编译命令
build_cmd='xcodebuild' if [ "$build_workspace" != "" ];then
#编译workspace
if [ "$build_scheme" = "" ];then
echo "Error! Must provide a scheme by -s option together when using -w option to compile a workspace."
exit
fi build_cmd=${build_cmd}' -workspace '${build_workspace}' -scheme '${build_scheme}' -configuration '${build_config}' CONFIGURATION_BUILD_DIR='${compiled_path}' ONLY_ACTIVE_ARCH=NO' else
#编译project
build_cmd=${build_cmd}' -configuration '${build_config} if [ "$build_target" != "" ];then
build_cmd=${build_cmd}' -target '${build_target}
fi fi #编译工程
cd $project_path
$build_cmd || exit #进入build路径
cd $build_path #创建ipa-build文件夹
if [ -d ./ipa-build ];then
rm -rf ipa-build
fi
mkdir ipa-build #app文件名称
appname=$(basename ./${appdirname}/*.app)
#通过app文件名获得工程target名字
target_name=$(echo $appname | awk -F. '{print $1}')
#app文件中Info.plist文件路径
app_infoplist_path=${build_path}/${appdirname}/${appname}/Info.plist
#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${app_infoplist_path})
#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${app_infoplist_path})
#取displayName
displayName=$(/usr/libexec/PlistBuddy -c "print CFBundleDisplayName" ${app_infoplist_path})
#IPA名称
ipa_name="${displayName}_${platform_id}_${bundleShortVersion}_${build_config}_${bundleVersion}_$(date +"%Y%m%d")"
echo $ipa_name #xcrun打包
xcrun -sdk iphoneos PackageApplication -v ./${appdirname}/*.app -o ${build_path}/ipa-build/${ipa_name}.ipa || exit if [ "$output_path" != "" ];then
cp ${build_path}/ipa-build/${ipa_name}.ipa $output_path/${ipa_name}.ipa
echo "Copy ipa file successfully to the path $output_path/${ipa_name}.ipa"
fi

作者很细心地解释了整个脚本的使用注意事项,我们可以直接使用。

1、新建一个目录:/Users/username/Documents/Jenkins/xcode-shell ,将“ipa-build”复制到里面。

2、在上述目录下,新建一个dis-one-key-ipa-build.sh文件,内容为:

 #!/bin/bash
./ipa-build /Users/username/Documents/TestOneKeyPublish/ -n -t TestOneKeyPublishEnterprise -o /Users/username/Documents/Jenkins/xcode-shell

其中/Users/username/Documents/TestOneKeyPublish/为工程路径,-n表明打包前执行clean,-t后面指明target名,-o后面指明目标ipa文件的位置。

3、给予dis-one-key-ipa-build.sh执行权限。然后在命令行中执行: ./dis-one-key-ipa-build.sh

这时候就会自动打包,完成后,会在/Users/username/Documents/Jenkins/xcode-shell目录下生成一个ipa文件,文件名很详细。

4、同理可以新建一个用来AdHoc发布的dev-one-key-ipa-build.sh,内容为:

 #!/bin/bash
./ipa-build /Users/username/Documents/TestOneKeyPublish/ -n -t TestOneKeyPublish -o /Users/username/Documents/Jenkins/xcode-shell

现在,可以在命令行通过执行不同的脚本文件来生成不同的包,再也不需要来回切换bundle和code singing了。

  • 改进的方面:

xcode_shell项目里面,还有一些功能强大的脚本,可以配置出更加自动化的脚本,这些在gitHub的主页上都有说明,有需要的可以研究一下。

iOS开发 - 开发版+企业版无线发布一键打包的更多相关文章

  1. iOS开发基础之开发证书的说明和发布

    1.首先通过钥匙串访问--证书助理--从证书颁发机构请求证书--填写证书信息(邮箱,常用名称,存储到磁盘)--存储为(自定义名称.certSigningReuqest,简称CSR文件,只是为了提交到苹 ...

  2. HubbleDotNet 最新绿色版,服务端免安装,基于eaglet 最后V1.2.8.9版本开发,bug修正,支持一键生成同步表

    HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使用者只需会 ...

  3. iOS 11开发教程(十)iOS11无线连接手机真机测试

    iOS 11开发教程(十)iOS11无线连接手机真机测试 在Xcode 9.0中,已经可以通过无线连接手机进行真机测试了.具体的操作步骤如下: (1)首先需要使用数据线将手机连接到苹果电脑上. (2) ...

  4. 下载-MS SQL Server 2005(大全版)含开发人员版、企业版、标准版【转】

    中文名称:微软SQL Server 2005 英文名称:MS SQL Server 2005资源类型:ISO版本:开发人员版.企业版.标准版发行时间:2006年制作发行:微软公司地区:大陆语言:普通话 ...

  5. iOS移动开发周报-第25期

    iOS移动开发周报-第25期 [摘要]:本期iOS移动开发周报带来如下内容:苹果发布 iPhone6 和 Apple Watch.Swift 1.0 GM发布.Xcode 6支持PDF Vector作 ...

  6. 20个可以帮你简化iOS app开发流程的工具

    这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...

  7. ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  9. iOS常用开发资源整理

    在行--专家付费咨询 杂项 App Release Checklist—iOS App发布清单. Hey Focus—帮助你专注于一个任务. Objective Cloud—Objective C A ...

随机推荐

  1. 2020 新个税算的头疼?会 python,这都不是事儿...

    背景 今年疫情复工后,财务小姐姐给我们普及了2020年新个税的算法.. 听完之后的感觉就是:恩,原来是这么回事! 虽然是个小工薪阶级,但是对于扣多少税还是很关心的.于是拿起笔算了算2月份的个税,产生了 ...

  2. 后台管理遇到的坑一、style中css样式怎么传入变量值

    第一.给标签定义style变量 第二.在data中定义 第三.在methods中的方法中给样式赋值

  3. C++ 结构体sturct练习

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> struct Student { ];// 姓名 int id; //id int a ...

  4. vue中计算属性中的set和get

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <body& ...

  5. Spark入门(七)--Spark的intersection、subtract、union和distinc

    Spark的intersection intersection顾名思义,他是指交叉的.当两个RDD进行intersection后,将保留两者共有的.因此对于RDD1.intersection(RDD2 ...

  6. Hadoop集群搭建(四)~centos6.8关闭防火墙

    一.centos关闭防火墙 1,关闭防火墙.service iptables stop 2,关闭防火墙开机自启.chkconfig iptables off 3,查看防火墙状态.service ipt ...

  7. mui switch 点击事件不冒泡

    工作上遇到一个问题 手机移动端app,采用mui框架,要求左边是手机号码,右边是switch开关,并且点击标题的时候,可以展开下面人员的基本信息. 采用了折叠面板. 先上图如下: 开始时出现的问题是: ...

  8. 在Windows中像Linux里一样使用CMake和make

    1. 安装GCC环境 1.1 安装MinGW(Minimalist GNU for Windows) 首先下载MinGW,并安装.安装完成之后运行MinGW Installer.界面如下.勾选自己需要 ...

  9. SpringMVC框架——视图解析

    SpringMVC视图解析,就是将业务数据绑定给JSP域对象,并在客户端进行显示. 域对象: pageContext.request.session.application 业务数据绑定是有ViewR ...

  10. 从零开始学习R语言(一)——数据结构之“向量”(Vector)

    本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/59688569 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/125370 ...