zoukankan      html  css  js  c++  java
  • 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:ccf.developer@gmail.com
     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的主页上都有说明,有需要的可以研究一下。

  • 相关阅读:
    Dockerize a .NET Core application
    Images之管理image
    Images之Dockerfile中的命令2
    Images之Dockerfile中的命令1
    Docker Builders:Builder pattern vs. Multi-stage builds in Docker
    Images之multi-stage builds
    Images之base image
    Images之Dockerfiles
    Docker 开发最佳实践
    Docker 开发概述
  • 原文地址:https://www.cnblogs.com/boch2436/p/4187326.html
Copyright © 2011-2022 走看看