代码改变世界

iOS开发系列-Shell脚本生成IPA

2018-08-07 19:43  iCoderHong  阅读(1455)  评论(0编辑  收藏  举报

概述

在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目。

自动化脚本编译打包IPA

常见的iOS项目就是基于xcodeproj。目前大部分公司项目都是用CocoaPod 管理第三方库,也就是项目基于xcworkspace 。这两种项目在编译时候命令有一些区别,下面分别写两种脚本供参考。

普通项目编译

PackageApplication方式生成ipa的方式苹果已经不建议使用了,取而代之的是xcodebuild -exportArchive

#!/bin/bash

ZWProjectName="TestProj"
ZWScheme="TestProj"
ZWConfiguration="Release"

ZWDate=`date +%Y%m%d_%H%M`
ZWWorkspace=`pwd`
echo "workspace=$ZWWorkspace-----------------------"
ZWBuildDir="$ZWWorkspace/build"        #build路径
ZWBuildTempDir="$ZWBuildDir/temp/$ZWDate"    #构建过程中的文件
HCIpaDir="$ZWBuildDir/ipa"                                #生成ipa文件路径

:<<!
#编译 链接 签名 生成app
#如果要构建workspace,你必须指定-workspace和-scheme参数。
xcodebuild \
-workspace "$ZWWorkspace/$ZWProjectName.xcodeproj/project.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
clean \
build \
-derivedDataPath "$ZWBuildTempDir"
#CODE_SIGN_IDENTITY=证书
#PROVISIONING_PROFILE=描述文件UUID

#生成ipa  本质主要是对生成app进行压缩成ipa
xcrun -sdk iphoneos \
-v PackageApplication "$ZWBuildTempDir/Build/Products/$ZWConfiguration-iphoneos/$ZWProjectName.app" \
-o "$HCIpaDir/$ZWDate.ipa" #这里反复报错 如果输出的目录不存在就报错 Unable to create '....." 解决办法 手动穿件输出测文件夹层级结构

#清除构建的文件
rm -rf $ZWBuildDir/temp

open $HCIpaDir
!

#-------PackageApplication已经不推荐使用了 warning: PackageApplication is deprecated, use `xcodebuild -exportArchive` instead.-----

xcodebuild archive \
-workspace "$ZWWorkspace/$ZWProjectName.xcodeproj/project.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive"
CODE_SIGN_IDENTITY="" #证书
PROVISIONING_PROFILE="" #描述文件UUID

xcodebuild \
-exportArchive \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive" \
-exportPath "$HCIpaDir/$ZWDate/" \
-exportOptionsPlist "./exportOptionsPlist.plist" \
#CODE_SIGN_IDENTITY="" #证书
#PROVISIONING_PROFILE="" #描述文件UUID

#这里不需要设置证书
#编译流程
#1.首先看ZWConfiguration是Release还是Debug
#2.如果是Release那么就去General->Signing(Release)的Provisioning Profile编译
#3.如果是Debug那么就去General->Signing(Debug)的Provisioning Profile编译

#如果是发布store的包 只需将配置设置General->Signing(Release)的Provisioning Profile选择Store 描述文件

:<<!
    编写过程遇到的报错:
    1.exportOptionsPlist.plist文件的编写
        xcode直接先Archive 拿到ExportOptions.plist
    2.下面这个报错纠结了我好久,

#    Error Domain=NSCocoaErrorDomain Code=384
# 详细报错
#2018-03-06 17:18:43.013 xcodebuild[2836:4964380] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/TestProj_2018-03-06_17-18-43.012.xcdistributionlogs'.
#2018-03-06 17:18:43.476 xcodebuild[2836:4964380] [MT] IDEDistribution: Step failed: <IDEDistributionPackagingStep: 0x7f8ca5d414e0>: Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/ipatool-json-filepath-U38ZKM}
#error: exportArchive: The data couldn’t be read because it isn’t in the correct format.

#Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/ipatool-json-filepath-U38ZKM}

#** EXPORT FAILED **

#  最终发现了问题关闭compileBitcode 设置为NO
!

#通过蒲公英提供的上传应用 API,调用系统的 curl 命令来上传应用。
#FilePath="$HCIpaDir/$ZWDate/${ZWScheme}.ipa"
#UKey="User key" #开发者的用户 Key,在应用管理-API中查看
#ApiKey="API key" #是开发者的 API Key,在应用管理-API中查看 注意不是APPKey

#chmod -R 777 "${FilePath}"
#curl \
#-F "file=@${FilePath}" \
#-F "uKey=${UKey}" \
#-F "_api_key=${ApiKey}" \
#https://www.pgyer.com/apiv2/app/upload

基于CocoaPod的工程脚本编译

对于使用工作空间管理工程,唯一不同的是在xcodebuild archive需要加参数-workspacescheme

#!/bin/bash

ZWProjectName="lifeCristal"
ZWScheme="lifeCristal"
ZWConfiguration="Release"

ZWDate=`date +%Y%m%d_%H%M`
ZWWorkspace=`pwd`
echo "workspace=$ZWWorkspace-----------------------"
ZWBuildDir="$ZWWorkspace/build"        #build路径
ZWBuildTempDir="$ZWBuildDir/temp/$ZWDate"    #构建过程中的文件
HCIpaDir="$ZWBuildDir/ipa"                                #生成ipa文件路径

xcodebuild archive \
-workspace "$ZWWorkspace/$ZWProjectName.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive"
CODE_SIGN_IDENTITY="" #证书
PROVISIONING_PROFILE="" #描述文件UUID

xcodebuild \
-exportArchive \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive" \
-exportPath "$HCIpaDir/$ZWDate/" \
-exportOptionsPlist "./exportOptionsPlist.plist" \
CODE_SIGN_IDENTITY="" #证书
PROVISIONING_PROFILE="" #描述文件UUID

FilePath="$HCIpaDir/$ZWDate/${ZWScheme}.ipa"
UKey="013cca42bc5347715f895cfc8061f75f"
ApiKey="4861c59806712e3473c867520884236f"

chmod -R 777 "${FilePath}"
curl \
-F "file=@${FilePath}" \
-F "uKey=${UKey}" \
-F "_api_key=${ApiKey}" \
https://www.pgyer.com/apiv2/app/upload

证书跟描述文件UUID获取

  • 获取本机可用的开发证书
security find-identity -v -p codesigning

  • 获取描述文件的UUDI
    我们Mac电脑所有描述文件目录 个人资源库/MobileDevice/Provisioning Profiles/
    执行命令
/usr/bin/security cms -D -i 描述文件路径

通常描述文件的名称就是描述文件的UUID。

exportOptionsPlist.plist文件获取

这个文件中的内容会随着Xode的版本而发生改变。我这边做法是自己手动打包第一次,将生成的ExportOptions.plist改名为exportOptionsPlist.plist。后续每次打包都是用这个plist就可以了。

创建的编译报错

在实际使用避免不了各种错误,下面对一些常见的错误解决。

Bitcode引发的错误

解决办法:在exportOptionsPlist.plist关闭BitcodeNO