flutter项目iOS shell脚本打包上传Fir.im/蒲公英/AppStore

#!/bin/bash

# 参考命令行打包上传文章:https://www.jianshu.com/p/9375a4cbd8cb
# App Store上传参考文章:https://www.jianshu.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专用密码
    # 参考文章:https://www.jianshu.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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260