iOS开发 - 开发版+企业版无线发布一键打包

背景:项目进入快速迭代期,需要快速地交付出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”脚本,内容如下:

  1 #!/bin/bash

  2 

  3 #--------------------------------------------

  4 # 功能:编译xcode项目并打ipa包

  5 # 使用说明:

  6 #        编译project

  7 #            ipa-build <project directory> [-c <project configuration>] [-o <ipa output directory>] [-t <target name>] [-n] [-p <platform identifier>]

  8 #        编译workspace

  9 #            ipa-build  <workspace directory> -w -s <schemeName> [-c <project configuration>] [-n]

 10 #

 11 # 参数说明:-c NAME                工程的configuration,默认为Release。

 12 #            -o PATH                生成的ipa文件输出的文件夹(必须为已存在的文件路径)默认为工程根路径下的”build/ipa-build“文件夹中

 13 #            -t NAME                需要编译的target的名称

 14 #            -w                    编译workspace    

 15 #            -s NAME                对应workspace下需要编译的scheme

 16 #            -n                    编译前是否先clean工程

 17 #            -p                    平台标识符

 18 # 作者:ccf

 19 # E-mail:[email protected]

 20 # 创建日期:2012/09/24

 21 #--------------------------------------------

 22 # 修改日期:2013/02/18

 23 # 修改人:ccf

 24 # 修改内容:打包方式改为使用xcrun命令,并修改第二个参数

 25 #--------------------------------------------

 26 # 修改日期:2013/04/25

 27 # 修改人:ccf

 28 # 修改内容:采用getopts来处理命令参数,并增加编译前清除选项

 29 #--------------------------------------------

 30 # 修改日期:2013/04/26

 31 # 修改人:ccf

 32 # 修改内容:增加编译workspace的功能

 33 #--------------------------------------------

 34 

 35 

 36 

 37 if [ $# -lt 1 ];then

 38     echo "Error! Should enter the root directory of xcode project after the ipa-build command."

 39     exit 2

 40 fi

 41 

 42 if [ ! -d $1 ];then

 43     echo "Error! The first param must be a directory."

 44     exit 2

 45 fi

 46 

 47 #工程绝对路径

 48 cd $1

 49 project_path=$(pwd)

 50 

 51 #编译的configuration,默认为Release

 52 build_config=Release

 53 

 54 param_pattern=":p:nc:o:t:ws:"

 55 OPTIND=2

 56 while getopts $param_pattern optname

 57   do

 58     case "$optname" in       

 59       "n")        

 60         should_clean=y        

 61         ;;

 62       "p")

 63         tmp_optind=$OPTIND

 64         tmp_optname=$optname

 65         tmp_optarg=$OPTARG

 66 

 67         OPTIND=$OPTIND-1

 68         if getopts $param_pattern optname ;then

 69             echo  "Error argument value for option $tmp_optname"

 70             exit 2

 71         fi

 72         OPTIND=$tmp_optind

 73 

 74         platform_id=$tmp_optarg

 75         

 76         ;;

 77       "c")        

 78         tmp_optind=$OPTIND

 79         tmp_optname=$optname

 80         tmp_optarg=$OPTARG

 81         OPTIND=$OPTIND-1

 82         if getopts $param_pattern optname ;then

 83             echo  "Error argument value for option $tmp_optname"

 84             exit 2

 85         fi

 86         OPTIND=$tmp_optind

 87 

 88         build_config=$tmp_optarg

 89         

 90         ;;

 91       "o")

 92         tmp_optind=$OPTIND

 93         tmp_optname=$optname

 94         tmp_optarg=$OPTARG

 95 

 96         OPTIND=$OPTIND-1

 97         if getopts $param_pattern optname ;then

 98             echo  "Error argument value for option $tmp_optname"

 99             exit 2

100         fi

101         OPTIND=$tmp_optind

102 

103 

104         cd $tmp_optarg

105         output_path=$(pwd)

106         cd ${project_path}

107 

108         if [ ! -d $output_path ];then

109             echo "Error!The value of option o must be an exist directory."

110             exit 2

111         fi

112 

113         ;;

114       "w")

115         workspace_name='*.xcworkspace'

116         ls $project_path/$workspace_name &>/dev/null

117         rtnValue=$?

118         if [ $rtnValue = 0 ];then

119             build_workspace=$(echo $(basename $project_path/$workspace_name))

120         else

121             echo  "Error!Current path is not a xcode workspace.Please check, or do not use -w option."

122             exit 2

123         fi

124         

125         ;;

126       "s")

127         tmp_optind=$OPTIND

128         tmp_optname=$optname

129         tmp_optarg=$OPTARG

130 

131         OPTIND=$OPTIND-1

132         if getopts $param_pattern optname ;then

133             echo  "Error argument value for option $tmp_optname"

134             exit 2

135         fi

136         OPTIND=$tmp_optind

137 

138         build_scheme=$tmp_optarg

139         

140         ;;

141       "t")

142         tmp_optind=$OPTIND

143         tmp_optname=$optname

144         tmp_optarg=$OPTARG

145 

146         OPTIND=$OPTIND-1

147         if getopts $param_pattern optname ;then

148             echo  "Error argument value for option $tmp_optname"

149             exit 2

150         fi

151         OPTIND=$tmp_optind

152 

153         build_target=$tmp_optarg

154         

155         ;;

156 

157 

158       "?")

159         echo "Error! Unknown option $OPTARG"

160         exit 2

161         ;;

162       ":")

163         echo "Error! No argument value for option $OPTARG"

164         exit 2

165         ;;

166       *)

167       # Should not occur

168         echo "Error! Unknown error while processing options"

169         exit 2

170         ;;

171     esac

172   done

173 

174 

175 #build文件夹路径

176 build_path=${project_path}/build

177 #生成的app文件目录

178 appdirname=Release-iphoneos

179 if [ $build_config = Debug ];then

180     appdirname=Debug-iphoneos

181 fi

182 if [ $build_config = Distribute ];then

183     appdirname=Distribute-iphoneos

184 fi

185 #编译后文件路径(仅当编译workspace时才会用到)

186 compiled_path=${build_path}/${appdirname}

187 

188 #是否clean

189 if [ "$should_clean" = "y" ];then

190     xcodebuild clean -configuration ${build_config}

191 fi

192 

193 #组合编译命令

194 build_cmd='xcodebuild'

195 

196 if [ "$build_workspace" != "" ];then

197     #编译workspace

198     if [ "$build_scheme" = "" ];then

199         echo "Error! Must provide a scheme by -s option together when using -w option to compile a workspace."

200         exit 2

201     fi

202     

203     build_cmd=${build_cmd}' -workspace '${build_workspace}' -scheme '${build_scheme}' -configuration '${build_config}' CONFIGURATION_BUILD_DIR='${compiled_path}' ONLY_ACTIVE_ARCH=NO'

204 

205 else

206     #编译project

207     build_cmd=${build_cmd}' -configuration '${build_config}

208 

209     if [ "$build_target" != "" ];then

210         build_cmd=${build_cmd}' -target '${build_target}

211     fi

212     

213 fi

214 

215 

216 #编译工程

217 cd $project_path

218 $build_cmd || exit

219 

220 #进入build路径

221 cd $build_path

222 

223 #创建ipa-build文件夹

224 if [ -d ./ipa-build ];then

225     rm -rf ipa-build

226 fi

227 mkdir ipa-build

228 

229 

230 

231 #app文件名称

232 appname=$(basename ./${appdirname}/*.app)

233 #通过app文件名获得工程target名字

234 target_name=$(echo $appname | awk -F. '{print $1}')

235 #app文件中Info.plist文件路径

236 app_infoplist_path=${build_path}/${appdirname}/${appname}/Info.plist

237 #取版本号

238 bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${app_infoplist_path})

239 #取build值

240 bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${app_infoplist_path})

241 #取displayName

242 displayName=$(/usr/libexec/PlistBuddy -c "print CFBundleDisplayName" ${app_infoplist_path})

243 #IPA名称

244 ipa_name="${displayName}_${platform_id}_${bundleShortVersion}_${build_config}_${bundleVersion}_$(date +"%Y%m%d")"

245 echo $ipa_name

246 

247 #xcrun打包

248 xcrun -sdk iphoneos PackageApplication -v ./${appdirname}/*.app -o ${build_path}/ipa-build/${ipa_name}.ipa || exit

249 

250 if [ "$output_path" != "" ];then

251     cp ${build_path}/ipa-build/${ipa_name}.ipa $output_path/${ipa_name}.ipa

252     echo "Copy ipa file successfully to the path $output_path/${ipa_name}.ipa"

253 fi

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

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

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

1 #!/bin/bash

2 ./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,内容为:

1 #!/bin/bash

2 ./ipa-build /Users/username/Documents/TestOneKeyPublish/ -n -t TestOneKeyPublish -o /Users/username/Documents/Jenkins/xcode-shell

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

  • 改进的方面:

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

 

你可能感兴趣的:(ios开发)