阅读 270

iOS 高效开发必备技巧之自动化打包(shell xcode11 上传App Store 蒲公英等平台)

闲话不说,直接来干货。

内容概况

1.shell 打包导出ipa 包,自动上传 App Store、蒲公英、Fir等

今日亲测验证 xcode11 下,App Store上传成功,蒲公英上传成功
复制代码

2.准备工作

脚本文件、检测证书匹配性 拿到需要用到的各平台参数
复制代码

3.打包过程中遇到的问题及解决方案

针对xcode10和xcode11出来的一些问题的特别说明
其他问题
复制代码

4.参考文献

之前收藏的几篇不错的博客,供大家一起分享学习。
复制代码

5.延续看图说话的方式进行分享。

操作步骤

涉及到的文件有3个:

脚本文件:github.com/kepuna/arch…

将这3个文件放到工程内,具体安放位置见下图:

其中exportAppStore.plist 也做了相应的修改,具体见图:

exportTest.plist 具体内容见图:

备注一下:我在:github.com/kepuna/arch… 这个基础上进行了改造,需要注意的点都进行了详细的备注,改造内容如下:

#使用方法

if [ ! -d ./IPADir ];
then
mkdir -p IPADir;
fi

#工程绝对路径
project_path=$(cd `dirname $0`; pwd)

#工程名 将XXX替换成自己的工程名
project_name= XXX

#scheme名 将XXX替换成自己的sheme名
scheme_name=XXX

#打包模式 Debug/Release
development_mode=Debug

#build文件夹路径
build_path=${project_path}/build

#plist文件所在路径
exportOptionsPlistPath=${project_path}/exportTest.plist

#导出.ipa文件所在路径
exportIpaPath=${project_path}/IPADir/${development_mode}


echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc] "

##
read number
while([[ $number != 1 ]] && [[ $number != 2 ]])
do
echo "Error! Should enter 1 or 2"
echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc] "
read number
done

if [ $number == 1 ];then
development_mode=Release
exportOptionsPlistPath=${project_path}/exportAppstore.plist
else
development_mode=Debug
exportOptionsPlistPath=${project_path}/exportTest.plist
fi

echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild \
clean -configuration ${development_mode} -quiet  || exit


echo '///--------'
echo '/// 清理完成'
echo '///--------'
echo ''

echo '///-----------'
echo '/// 正在编译工程:'${development_mode}
echo '///-----------'

 # UseModernBuildSystem 编译模式,NO 采用传统的(legacy build system),YES采用现在的(new build system)
 # 工程里面有pod 使用 archive -workspace ${project_path}/${project_name}.xcworkspace
 # 工程里面没有pod 使用  archive -project ${project_name}.xcodeproj

xcodebuild \
-UseModernBuildSystem=NO \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive  -quiet  || exit

echo '///--------'
echo '/// 编译完成'
echo '///--------'
echo ''

echo '///----------'
echo '/// 开始ipa打包'
echo '///----------'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit

if [ -e $exportIpaPath/$scheme_name.ipa ]; then
echo '///----------'
echo '/// ipa包已导出'
echo '///----------'
open $exportIpaPath
else
echo '///-------------'
echo '/// ipa包导出失败 '
echo '///-------------'
fi
echo '///------------'
echo '/// 打包ipa完成  '
echo '///-----------='
echo ''

echo '///-------------'
echo '/// 开始发布ipa包 '
echo '///-------------'


if [ $number == 1 ];then

#验证并上传到App Store
# 将-u 后面的XXX替换成自己的AppleID的账号,-p后面的XXX替换成自己的密码
#altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
#"$altoolPath" --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u "XXXXXXXXX" -p "XXXXXXX" -t ios --output-format xml
#"$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u  "XXXXXXX" -p "XXXXXXX" -t ios --output-format xml

# 验证并上传到APP Store  xcode11之后方法   验证成功
# apiKey apiIssuer   苹果后台找  下面用XXXXX 代替
xcrun altool --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -t ios --apiKey "XXXXX" --apiIssuer "XXXXXXXXXX-XXXXX-XXXXX-XXXXX-XXXXXXXXXX" --verbose
xcrun altool --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -t ios --apiKey "XXXXX" --apiIssuer "XXXXXXXXXX-XXXXX-XXXXX-XXXXX-XXXXXXXXXX" --verbose

else

##上传到Fir   没有进行实名认证,暂不验证
## 将XXX替换成自己的Fir平台的token
#fir login -T XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#fir publish $exportIpaPath/$scheme_name.ipa


#上传蒲公英  成功验证
#uKey  _api_key 将用XXXXX代替,在蒲公英里面找
echo '/+++++++ 上传蒲公英 +++++++/'

curl -F "file=@$exportIpaPath/$scheme_name.ipa" \
-F "uKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-F "_api_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
https://qiniu-storage.pgyer.com/apiv1/app/upload

append_path="已上传到蒲公英"
mv $exportIpaPath $exportIpaPath$append_path
echo '/+++++++ 成功上传到蒲公英 +++++++/'

fi

exit 0

复制代码

补充:运行shell脚本:

需要特别提醒的地方

1.编译模式

2.工程中是否有pod

3.上传App Store的时候,注意xcode11 前后的命令不同

4.关于两个plist中需要注意的地方

5.操作完一次,我们工程里面跟我们导入的3个文件同路径下会生成2个文件,再下次再进行打包前需要删掉,否则clean不成功,也就不会继续打包了。

如果你的工程编译方式使用的是legacy build system 这种方式,那么我们需要做下面的操作,因为我们打包的时候,这里默认是new build system。

xcode11之后,我们打包的时候,需要使用密钥,这个过程中多了2个参数,同时还需要一个文件作为必备条件,我们这2个参数和文件的来源,见下图:

蒲公英打包的时候,需要用到的2个参数来源,见下图:

常出现的一些报错问题,列举几个典型的。尤其是xcode11的问题

1.由编译模式问题引起的问题,解决方法上面截图已写

ld: library not found for -lAFNetworking clang: error: linker command failed with exit code 1 (use -v to see invocation)

2.xcode11 打包的时候,在没有正确存放.private_keys 文件时候,会报下面错误

Could not find private key file: AuthKey_5ZGKY5BF7J.p8, in any of the following locations. ./private_keys or /private_keys or /.private_keys or /.appstoreconnect/private_keys 以下任何位置找不到私钥文件:AuthKey_XXXXX.p8。
./private_keys或<用户主目录> / private_keys或<用户主目录> /。private_keys或<用户主目录> /。appstoreconnect / private_keys

Could not find private key file: AuthKey_4PBMS86V4B.p8, in any of the following locations.

这个问题的具体解决方案上面已经截图了,这次再发一遍。这块容易出错。

补充:隐藏文件.private_keys 需要注意的点: 如果我们的根目录,没有显示出隐藏文件,那么我们可以使用下面两种方式让其显示根目录。

第一种:

在 macOS Sierra及以上(Mojave),我们可以使用快捷键 ⌘⇧.(Command + Shift + .) 来快速(在 Finder 中)显示和隐藏隐藏文件了。

第二种:

在终端使用:

//显示隐藏文件
defaults write com.apple.finder AppleShowAllFiles -bool true
//不显示隐藏文件
defaults write com.apple.finder AppleShowAllFiles -bool false
复制代码

最后需要重启Finder:

重启Finder:窗口左上角的苹果标志-->强制退出-->Finder-->重新启动

显示隐藏文件之后,我们就可以在根目录进行创建.private_keys 文件了。

3.证书相关问题 这个具体问题需要具体分析,保证 证书匹配就好了

成功上传蒲同英

不错的一些博客分享,这里有自动打包过程中遇到的其他问题,我们可以参考学习

www.cocoachina.com/articles/26…

简书中的“小白学金融”也是我哈~~

www.jianshu.com/p/2e32258ea…

www.jianshu.com/p/3506cb191…

www.jianshu.com/p/9021b3c9d…

关注下面的标签,发现更多相似文章
评论