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

2017-08-15  本文已影响276人  _compass

这是一篇关于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都不用打开了。

上一篇下一篇

猜你喜欢

热点阅读