iOS开发之Build版本号自增
1. 背景
在iOS项目打包时,有两个版本号,一个是Version,即显示在AppStore中的版本号,其key为CFBundleShortVersionString
,另一个是Build,即编译版本号,其key为CFBundleVersion
。
2. 问题发现
当App准备上架时,需要打包提交至AppStore审核,在这个过程中我们可能会多次上传ipa包。在Version相同的情况下,若Build还相同,则上传到App Store Connect时会提示已有该版本,不能再次上传。
3. 问题解决
为了避免这种情况,我们可以在每次打包前去手动修改Build,以保证不会重复。或者我们可以通过脚本让Build在每次打包时自动加一,省去每次手动修改的麻烦。
添加脚本的流程:
- Xcode切换到 Build Phases 选项卡;
- 点击左上角"+“号来增加一项"New Run Script Phase”;
- 添加如下脚本代码:
# ******************************************************
#
# Copyright 2015-2022 BTStudio. All rights reserved.
#
# Author : Wangzhi
# Last modified : 2022-09-21
# Email : wzqsyk@126.com
# Description : 每次Build或Archive后,编译版本号自动+1
#
# 注意: 编译版本号设置为整数时,该脚本才能实现其功能
#
# ******************************************************# 每次编译后编译版本号是否+1: 1-每次Build后+1 0-每次Archive后+1
INCREASE_WHEN_BUILD=0# Build或Archive的标志,默认为Build
BuildConfigurationFlag="Debug"BuildNumber=1 # 编译版本号if [ $INCREASE_WHEN_BUILD -eq 0 ]; thenBuildConfigurationFlag="Release"
fiecho "当前Xcode的Build Configuration: $CONFIGURATION"
if [ $BuildConfigurationFlag == "${CONFIGURATION}" ]; then# Info.plist中的编译版本号(BundleVersion)BuildVersionOfInfo="1" # 项目配置文件(xxx.xcodeproj/project.pbxproj)中的编译版本号(CURRENT_PROJECT_VERSION)BuildVersionOfConfig="1"# 1. 读取版本号BuildVersionOfInfo=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}")BuildVersionOfConfig=${CURRENT_PROJECT_VERSION}# 判断读取出来的BuildVersionOfInfo变量是否为字符串: $(CURRENT_PROJECT_VERSION)# - 若是,则需从CURRENT_PROJECT_VERSION读取版本号;# - 若不是,则读取出来的BuildVersionOfInfo即是版本号,需再判断与BuildVersionOfConfig的大小,取较大值;if [ $BuildVersionOfInfo == '$(CURRENT_PROJECT_VERSION)' ]; thenBuildNumber=${CURRENT_PROJECT_VERSION}else# 取较大值if [ $BuildVersionOfInfo -ge $BuildVersionOfConfig ]; thenBuildNumber=$BuildVersionOfInfoelseBuildNumber=$BuildVersionOfConfigfifi# 2. 版本号+1BuildNumber=$(($BuildNumber + 1))# 3. 新的版本号写入Info.plist/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BuildNumber" "${INFOPLIST_FILE}"echo "Build version need increase"
elseecho "Build version don't need increase"
fi
- 效果如下
- 之后每次进行打包时,Build会自动+1,避免了Build重复的问题。
提示:
- 可以双击 Build Auto Increase 进行名称的修改,增加一项 New Run Script Phase 后,Xcode默认名称为:Run Script ;
- 每次编译或打包后,可以查看脚本的执行结果,如下图所示:
小知识
1. PlistBuddy
PlistBuddy是Mac自带的专门解析plist的小工具,由于PlistBuddy并不在Mac默认的Path里,所以我们得通过绝对路径(/usr/libexec/PlistBuddy)来引用这个工具。
2. Shell基本语法
- 定义变量时,变量名不加美元符号$ (PHP语言中变量需要)。如:
your_name=“runoob.com” (注意:变量名和等号之间不能有空格)- 使用一个定义过的变量,只要在变量名前面加美元符号即可。如:
echo $your_name- 读取plist中某个字段的值,并赋给变量var:
var=$(/usr/libexec/PlistBuddy -c “Print :字段名” plist文件路径)- 修改plist中某个字段相应的值:
/usr/libexec/PlistBuddy -c “Set :字段名 值” plist文件路径- Shell的echo指令与PHP的echo指令类似,都是用于字符串的输出。
命令格式:echo string- Shell脚本没有{}括号,所以用fi表示if语句块的结束。
- #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。
iOS开发之Build版本号自增相关推荐
- iOS开发之ARC(自动引用计数)
iOS开发之ARC(自动引用计数) 英文原文:Automatic Reference Counting on iOS 参与翻译(4人): 纶巾客, showme, 李远超, 王宇龙 自动引用计数(AR ...
- iOS开发之AVKit框架使用
2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...
- (0045) iOS 开发之MBProgressHUD 源码学习
(0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1. 学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...
- (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接
1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...
- 李洪强iOS开发之RunLoop的原理和核心机制
李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...
- IOS开发之MD5加密和钥匙串的使用-oc
IOS开发之MD5加密和钥匙串的使用-oc 源码在我的主页,md5加密是用户登录安全的一个保障.不可逆的,可以暴力破解的. // // ViewController.m // MD5演练 // // ...
- IOS开发之CALayer基本属性和使用
IOS开发之CALayer基本属性和使用 // // ViewController.m // CALayer // // Created by 鲁军 on 2021/2/21. //#import & ...
- ios开发之plist 的文件的读写以及沙盒容器路径打印
ios开发之plist 的文件的读写以及沙盒容器路径打印 核心代码在这里 // // ViewController.m // 21-plist存储和沙盒路径 // // Created by 鲁军 o ...
- IOS开发之JSON文件的读写
IOS开发之JSON文件的读写 // // ViewController.m // 20-JSON的读写 // // Created by 鲁军 on 2021/2/13. //#import &qu ...
最新文章
- SAP PM入门系列29 - IW65 Display Activities
- 20170512 Python练习册0004统计英文的纯文本文件的单词出现的个数
- 习题6-2 使用函数求特殊a串数列和 (20 分)
- ElasticSearch6.3脚本更新
- 论文阅读笔记(三)【ACL 2021】Locate and Label: A Two-stage Identifier for Nested Named Entity
- 1.9 _07 不与最大数相同的数字之和 python
- 关于数据库中有自增主键时如何插入数据?
- 聚合maven+spring-boot打包可执行jar
- php 实现两变量值对换,PHP互换两个变量值的方法(不用第三变量)
- 新手小白python数据清洗代码_5天10分钟,学会数据清洗!(Python)
- 高职高考计算机网课app,本人准备高职高考,但是初中数学基础不行,所以求一套不错的初中数学练习题,教材的话我就刷网课。...
- 矩孔菲涅尔衍射 matlab,圆孔矩孔的菲涅尔衍射模拟(matlab实现)-工程光学
- 维宏控制卡win7 驱动_ncstudio(维宏控制系统)64位下载v5.4.86[百度网盘资源] - 软件学堂...
- 计算机自检报错无法开机,电脑开机不自检无显示是怎么回事?
- 8、Map存储世界杯信息相关操作
- Verilog rst
- SEO与SEM是什么?有何区别?
- python青少年编程_机器人Python青少年编程开发实例
- 如何解决百度云下载大文件限速问题
- LeetCode 695.岛屿的最大面积