#!/bin/bash
# 参考命令行打包上传文章://www.greatytc.com/p/9375a4cbd8cb
# App Store上传参考文章://www.greatytc.com/p/328adf860ad5
######################################## 使用说明 ##################################################
# 1. 复制一份`sh`并改名,在`sh`中更改为自己的用户目录和项目目录
# 2. `flutter`项目中改为要打包的对应环境
# 3. 给脚本可执行权限:`chmod +x ying_ios_achive_upload.sh`
# 4. 如果上传到`fir.im`,确保已安装`fir-cli`,安装命令:`sudo gem install fir-cli -n /usr/local/bin`
# 5. 切换到脚本目录`mobile_life`下执行脚本`. ./ying_ios_achive_upload.sh`,根据提示选择打包环境,后续自动打包上传到对应平台
# 前提一:
# flutter的iOS目录下,创建以下文件夹并放置文件:
# ios/exportOptions/Adhoc/ExportOptions.plist
# ios/exportOptions/Debug/ExportOptions.plist
# ios/exportOptions/Release/ExportOptions.plist
# ExportOptions.plist可在Xcode导出包时拿到,放到这里对应目录即可
# 前提二:
# 上传App Store,需要用到App专用密码,需要进入开发账号对应的AppleID账号管理网站中生成
# 蒲公英的API Key和User Key在蒲公英网站上获取
# Fir.im的API token从fir.im网站获取
# 前提三:
# 上传到Fir.im需要安装fir-cli,安装命令:`sudo gem install fir-cli -n /usr/local/bin`
# 前提四:
# iOS项目build号自增处理,Xcode中增加自增脚本:见本文件末尾备注
################################## 用户目录、项目目录配置 #############################################
# 用户目录配置
USER_DIR="/Users/yuanzhiying"
# 项目目录
PROJECT_DIR="$USER_DIR/mobile_life/info_valley"
######################################### 打包环境选择 ###############################################
# 检查错误代码
# 在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出,那么就可以避免一些脚本的危险操作。
# set -e
echo "\033[1;32m开始iOS打包 ----->\033[0m"
echo "\033[1;32m输入要打包上传的平台号:[ 0-正式环境(Release): App Store 1-正式环境(Adhoc): Fir.im 2-测试环境(Adhoc): 蒲公英 ] \033[0m"
# 打包类型 # Adhoc Release Debug
BUILD_TYPE="Adhoc" # 默认值
# 0-正式环境: App Store 1-正式环境: Fir.im 2-测试环境: 蒲公英
UPLOAD_TYPE=2 # 默认值
read number
while ([[ $number != 0 ]] && [[ $number != 1 ]] && [[ $number != 2 ]])
do
echo "\033[1;31m输入错误! 应该输入0 或 1 或 2 \033[0m"
echo "\033[1;32m输入要上传的平台号:[ 0-正式环境(Release): App Store 1-正式环境(Adhoc): Fir.im 2-测试环境(Adhoc): 蒲公英 ] \033[0m"
read number
done
if [ $number -eq 0 ]; then
# 正式环境 - 上传App Store
UPLOAD_TYPE=0
BUILD_TYPE="Release"
echo "\033[1;32m已选择将 [正式环境包(Release)] 上传到 [App Store] \033[0m"
elif [ $number -eq 1 ]; then
# 正式环境 - 上传Fir.im
UPLOAD_TYPE=1
BUILD_TYPE="Adhoc"
echo "\033[1;32m已选择将 [正式环境包(Adhoc)] 上传到 [Fir.im] \033[0m"
else
# 测试环境 - 上传蒲公英
UPLOAD_TYPE=2
BUILD_TYPE="Adhoc"
echo "\033[1;32m已选择将 [测试环境包(Adhoc)] 上传到 [蒲公英] \033[0m"
fi
# Achive 目录
ACHIVE_FILE_DIC="$USER_DIR/iOSAutoAchive/$BUILD_TYPE"
# 如果没有目录,创建该目录
if [ ! -d $ACHIVE_FILE_DIC ]; then
# 此处-p作用,如果多层目录没有则都会逐层创建
mkdir -p "$ACHIVE_FILE_DIC"
fi
# 开始打包的时间
start=`date +%s`
######################################### flutter 项目准备工作 ###############################################
# 切换到项目目录下
cd $PROJECT_DIR ||exit
echo "\033[1;32m切换到目录 info_valley 下 \033[0m\n"
## 拉取代码
#echo "拉取代码 ----->"
#git pull
#echo "拉取代码 \n"
# 清除flutter缓存
echo "\033[1;32m执行 flutter clean ----->\033[0m"
flutter clean
echo "\033[1;32m执行 flutter clean 成功 \033[0m\n"
# 拉取 flutter 依赖
echo "\033[1;32m执行 flutter pub get ----->\033[0m"
flutter pub get
echo "\033[1;32m执行 flutter pub get 成功 \033[0m\n"
# 更新 flutter 依赖
echo "\033[1;32m执行 flutter pub upgrade ----->\033[0m"
flutter pub upgrade
echo "\033[1;32m执行 flutter pub upgrade 成功 \033[0m\n"
######################################### iOS 项目准备工作 ###############################################
# 切换到 iOS 目录
cd ios ||exit
echo "\033[1;32m切换到目录 ios 下 \033[0m\n"
# 拉取 pod 库
echo "\033[1;32m执行 pod install ----->\033[0m"
pod install
echo "\033[1;32m执行 pod install 成功 \033[0m\n"
# 更新 pod 库
echo "\033[1;32m执行 pod update ----->\033[0m"
pod update
echo "\033[1;32m执行 pod update 成功 \033[0m\n"
# xcworkspace 文件
XCWORKSPACE_FILE="$PROJECT_DIR/ios/Runner.xcworkspace"
# target 名称
TARGET_NAME="Runner"
# 清除 iOS 项目
# Adhoc Release Debug
echo "\033[1;32mclean iOS 项目 ----->\033[0m"
xcodebuild clean -workspace "$XCWORKSPACE_FILE" -scheme "$TARGET_NAME"
echo "\033[1;32miOS 项目 clean 成功 \033[0m\n"
# Xcode Build Phases 中已经配置了自增脚本,这里就不需要自增了
## build 自增
#if [ $UPLOAD_TYPE -eq 0 ];
#then
#XCODE_PROJECT_DIR="$PROJECT_DIR/ios/Runner"
#XCODE_PROJECT_RELEASE_PLIST="$XCODE_PROJECT_DIR/Info-Release.plist"
#XCODE_PROJECT_DEBUG_PLIST="$XCODE_PROJECT_DIR/Info-Debug.plist"
#XCODE_PROJECT_PROFILE_PLIST="$XCODE_PROJECT_DIR/Info-Profile.plist"
#buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $XCODE_PROJECT_RELEASE_PLIST)
#echo "自增前build为: $buildNumber"
#buildNumber=$(expr $buildNumber + 1)
#echo "自增后build为: $buildNumber"
#/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" $XCODE_PROJECT_RELEASE_PLIST
#/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" $XCODE_PROJECT_DEBUG_PLIST
#/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" $XCODE_PROJECT_PROFILE_PLIST
#echo "当前build为: $buildNumber"
#fi
######################################### 开始打包 ###############################################
# 删除 Achive 目录下的所有文件
# 切换到 achive 目录下
cd $ACHIVE_FILE_DIC ||exit
echo "\033[1;32m切换到 Achive 目录下 ----->\033[0m"
# 删除该目录下所有文件
rm -rf *
echo "\033[1;32mAchive 历史文件删除成功 \033[0m\n"
# 切换到 ios 目录下
cd "$PROJECT_DIR/ios" ||exit
echo "\033[1;32m切换到 Achive 目录下 ----->\033[0m"
# 构建 Achive文件
echo "\033[1;32mAchive 开始构建 ----->\033[0m"
xcodebuild archive -workspace "$XCWORKSPACE_FILE" -scheme "$TARGET_NAME" -archivePath "$ACHIVE_FILE_DIC/$TARGET_NAME.xcarchive" -configuration "$BUILD_TYPE"
echo "\033[1;32mAchive 构建成功 \033[0m\n"
# 导出 ipa包
echo "\033[1;32mipa 包导出 ----->\033[0m"
xcodebuild -exportArchive -archivePath "$ACHIVE_FILE_DIC/$TARGET_NAME.xcarchive" -configuration $BUILD_TYPE -exportPath "$ACHIVE_FILE_DIC" -exportOptionsPlist "$PROJECT_DIR/ios/exportOptions/$BUILD_TYPE/ExportOptions.plist"
echo "\033[1;32mipa 包导出成功 \033[0m\n"
######################################### 上传蒲公英、Fir.im、AppStore ###############################################
echo "\033[1;32m开始上传 ----->\033[0m"
IPA_PATH="$ACHIVE_FILE_DIC/信息谷.ipa"
if [ $UPLOAD_TYPE -eq 0 ]; then
# 正式环境 - 上传App Store
echo "\033[1;32m[ 正式环境包(Release) ] 正在上传到 [ App Store ] ...\033[0m"
# 新上传方式
# 验证并上传到App Store
# 其中的-p后的密码为APP专用密码,在AppleID账号的安全里生成和管理,此处altool上传IPA无法使用AppleID账号的密码,必须使用APP专用密码
# 参考文章://www.greatytc.com/p/328adf860ad5
xcrun altool --validate-app -f $IPA_PATH -t iOS -u "你的AppleId开发者账号" -p "生成的APP专用密码"
xcrun altool --upload-app -f $IPA_PATH -t iOS -u "你的AppleId开发者账号" -p "生成的APP专用密码"
# 老的方式 Application Loader.app 已经不在Xcode中了,使用上面新方式
# # 将-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 $IPA_PATH -u "你的AppleId开发者账号" -p "你的AppleId开发者密码" -t ios --output-format xml
# "$altoolPath" --upload-app -f $IPA_PATH -u "你的AppleId开发者账号" -p "你的AppleId开发者密码" -t ios --output-format xml
echo "\n"
echo "\033[1;32m撒花~~ [ 正式环境包(Release) ] - [ App Store ] 上传成功 \033[0m\n"
elif [ $number -eq 1 ]; then
# 正式环境 - 上传Fir.im
echo "\033[1;32m[ 正式环境包(Adhoc) ] 正在上传到 [ Fir.im ] ...\033[0m"
fir login -T "你的fir.im的API token"
fir publish $IPA_PATH
echo "\n"
echo "\033[1;32m撒花~~ [ 正式环境包(Adhoc) ] - [ Fir.im ] 上传成功 \033[0m\n"
else
# 测试环境 - 上传蒲公英
echo "\033[1;32m[ 测试环境包(Adhoc) ] 正在上传到 [ 蒲公英 ] ...\033[0m"
#蒲公英API_KEY
MY_PGY_API_K="API_KEY"
#蒲公英USER_KEY
MY_PGY_UK="USER_KEY"
curl -F "file=@$IPA_PATH" -F "uKey=$MY_PGY_UK" -F "_api_key=$MY_PGY_API_K" https://qiniu-storage.pgyer.com/apiv1/app/upload
echo "\n"
echo "\033[1;32m撒花~~ [ 测试环境包(Adhoc) ] - [ 蒲公英 ] 上传成功 \033[0m"
fi
end=`date +%s`
SEC=$[ end - start ]
(( SEC < 60 )) && echo -e "\033[1;32m打包用时: $SEC 秒\033[0m\c"
(( SEC >= 60 && SEC < 3600 )) && echo -e "\033[1;32m打包用时: $(( SEC / 60 )) 分 $(( SEC % 60 )) 秒\033[0m\c"
(( SEC > 3600 )) && echo -e "\033[1;32m打包用时: $(( SEC / 3600 )) 小时 $(( (SEC % 3600) / 60 )) 分 $(( (SEC % 3600) % 60 )) 秒\033[0m\c"
# 从ios目录切换回脚本目录
cd ..
# Xcode中Build Phases添加的自增脚本:
##!/bin/bash
#if [ "Release" == "${CONFIGURATION}" ];
#then
#echo "AddBuildNumber begin"
#
#releasePlist="${PROJECT_DIR}/${INFOPLIST_FILE}"
#debugPlist="${PROJECT_DIR}/Runner/Info-Debug.plist"
#profilePlist="${PROJECT_DIR}/Runner/Info-Profile.plist"
#
## 获取plist的版本号
#InfoBuild=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${releasePlist}")
#
## 判断是否是字符串
#if echo $InfoBuild | grep -q '[^0-9]'
#then
# InfoBuild=0
#fi
#
#echo "AddBuildNumber-InfoBuild: $InfoBuild"
## 工程的版本号
#ProjectVersion=${CURRENT_PROJECT_VERSION}
#echo "AddBuildNumber-ProjectVersion: $ProjectVersion"
## 取最大的一个
#if [ $InfoBuild -ge $ProjectVersion ] ;then
#resultNum=$InfoBuild
#else
#resultNum=$ProjectVersion
#fi
#echo "AddBuildNumber-resultNum: $resultNum"
## 版本加1
#resultNum=$(expr $resultNum + 1)
## 写入plist
#/usr/libexec/Plistbuddy -c "Set CFBundleVersion $resultNum" "${releasePlist}"
#/usr/libexec/Plistbuddy -c "Set CFBundleVersion $resultNum" "${debugPlist}"
#/usr/libexec/Plistbuddy -c "Set CFBundleVersion $resultNum" "${profilePlist}"
#echo "AddBuildNumber number to$resultNum"
#fi
flutter项目iOS shell脚本打包上传Fir.im/蒲公英/AppStore
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...