美文网首页
一切都是因为懒—XCode自动打包

一切都是因为懒—XCode自动打包

作者: _compass | 来源:发表于2017-08-15 17:19 被阅读276次

    这是一篇关于XCode自动打包的文章以及xcodebuild, xrun两种打包方法写法。
    自动打包的文章非常非常多了,我写这篇也没什么新意,只是因为有了Android那篇,所以也得有iOS的。
    忽略这篇文章的名字,也是因为上篇起了这个名字。。。

    1.xrun方法:

    ##########################################################################################
    
    buildtype=sample-ol
    hosturl=https://xxx.xxx.xxx
    
    ##########################################################################################
    #拷贝替换资源
    
    #需要拷贝的资源路径
    resource_path=/Users/Compass/Package/Resource/${buildtype}/resource.zip
    
    current_dir=$(pwd)
    echo $current_dir
    cd $current_dir
    cd ..
    cd WReader/Sample
    workspace_pathbase=$(pwd)
    echo $workspace_pathbase
    
    #根据当前shell所在位置,获取到的工程代码路径
    workspace_path=${workspace_pathbase}/Sample
    
    echo ======Begin Build=========
    
    #resource在工程里的路径
    resource_workpath=${workspace_path}/resource.zip
    #拷贝资源到工程路径,强制替换
    cp ${resource_path} ${resource_workpath}
    
    ##########################################################################################
     # 指定ipa的输出位置
    ipa_path=/Users/Compass/Package/app/$(date +%Y%m%d)
    
    # 配置文件的位置,修改配置文件里的某些参数
    config_plist=${workspace_path}/Resource/config.plist
      
    # 修改config
    /usr/libexec/PlistBuddy -c "Set:hosturl ${hosturl}" ${config_plist}
    
    # 清空上一次的文件夹
    rm -rf ${workspace_pathbase}/Build
    
    # 进入要工作的文件夹
    cd ${workspace_pathbase}
     
    # 打包项目名字
    scheme_name=Sample
     
    # ipa名字
    ipa_name=${buildtype}
    
    # 打包使用的证书
    CODE_SIGN_IDENTITY="iPhone Distribution: Beijing XXXXXX XXXXXX, XXXXXX."
     
    # 打包使用的描述文件
    PROVISIONING_PROFILE="XXXX-XXXX-XXXX-XXXX-XXXXXXXXX"
    
    # 指定app的输出位置 也就是Demo中build文件夹的位置
    build_path=${workspace_pathbase}/Build
     
    # 生成app
    xcodebuild -project ${workspace_path}.xcodeproj -target ${scheme_name} -configuration Release clean -sdk iphoneos build CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" SYMROOT="${build_path}"
    
    mkdir /Users/Compass/Package/app/$(date +%Y%m%d)
    
    xcrun -sdk iphoneos -v PackageApplication ${build_path}/Release-iphoneos/Sample.app -o ${ipa_path}/${ipa_name}.ipa
    
    echo ======End Build=========
    
    

    其实关键只有两步,上面一大堆都是找路径和拷贝资源文件的:

    # 1.build app
    xcodebuild -project ${workspace_path}.xcodeproj -target ${scheme_name} -configuration Release clean -sdk iphoneos build CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" SYMROOT="${build_path}"
    # 2.生成ipa
    xcrun -sdk iphoneos -v PackageApplication ${build_path}/Release-iphoneos/Sample.app -o ${ipa_path}/${ipa_name}.ipa
    

    其中,打包需要的证书,描述文件如果不知道在哪里看,打开xcodeproj/project.pbxproj,以文本方式打开:

    CODE_SIGN_IDENTITY的地方:

    image.png
    PROVISIONING_PROFILE的地方:
    image.png
    用xrun打包的时候,其实使用的是PackageApplication工具,但是这个工具在XCode8.2.1(好像是这个版本)以后就没有了,所以,如果报找不到这个工具的错误,可以参照这位同学方法放回去:
    http://blog.csdn.net/itiapp_home/article/details/70241011
    用xrun打包成功之后,会有一个警告:
    warning: PackageApplication is deprecated, use `xcodebuild -exportArchive` instead.
    

    因此,如果我们不用xrun打包,还有其他的方法,就是使用xcodebuild exportArchive:

    2.xcodebuild导出ipa:

    # 指定exportplist位置
    export_plist=${workspace_path}/Resource/exportplist.plist
    
    # 1.清空
    xcodebuild clean -project ${workspace_path}.xcodeproj -target ${scheme_name}
    
    # 2.指定输出xcarchive路径,打包xcarchive
    archivepath=${build_path}/Archive/Sample.xcarchive
    xcodebuild archive -project ${workspace_path}.xcodeproj -scheme ${scheme_name} -configuration Release -archivePath ${archivepath} 
    
    # 2.输出ipa
    xcodebuild -exportArchive -archivePath ${archivepath} -exportPath ${ipa_path}  -exportOptionsPlist ${export_plist}
    
    

    其中exportplist里的内容:

    <?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>method</key>
        <string>enterprise</string>
        <key>teamID</key>
        <string>xxxxxxx</string>
    </dict>
    </plist>
    
    

    method是打包的类型,文档上有ad-hoc,enterprise等几种值,我这里使用的是enterprise.其他值不清楚的大家搜一下文档。
    其实这几个值,也可以在shell里编译的时候自动写值,写入方法参照上面plist写入方法。
    TeamID的值是DEVELOPMENT_TEAM的值:

    两种方法我都测过了,都可以打包成功。
    因为我不需要使用蒲公英等平台,所以其他就不介绍了。

    有一点小郁闷:因为iOS打包的时候,developer和distribution的包使用的证书是不一样的,每次编译的时候,需要手动选一下证书,否则可以和android一样一键搞定,连IDE都不用打开了。

    相关文章

      网友评论

          本文标题:一切都是因为懒—XCode自动打包

          本文链接:https://www.haomeiwen.com/subject/ilfvrxtx.html