1. 背景

在iOS项目打包时,有两个版本号,一个是Version,即显示在AppStore中的版本号,其key为CFBundleShortVersionString,另一个是Build,即编译版本号,其key为CFBundleVersion

2. 问题发现

当App准备上架时,需要打包提交至AppStore审核,在这个过程中我们可能会多次上传ipa包。在Version相同的情况下,若Build还相同,则上传到App Store Connect时会提示已有该版本,不能再次上传。

3. 问题解决

为了避免这种情况,我们可以在每次打包前去手动修改Build,以保证不会重复。或者我们可以通过脚本让Build在每次打包时自动加一,省去每次手动修改的麻烦。

添加脚本的流程:
  1. Xcode切换到 Build Phases 选项卡;
  2. 点击左上角"+“号来增加一项"New Run Script Phase”;
  3. 添加如下脚本代码:
# ******************************************************
#
# 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
  1. 效果如下
  2. 之后每次进行打包时,Build会自动+1,避免了Build重复的问题。

提示:

  1. 可以双击 Build Auto Increase 进行名称的修改,增加一项 New Run Script Phase 后,Xcode默认名称为:Run Script ;
  2. 每次编译或打包后,可以查看脚本的执行结果,如下图所示:

小知识

1. PlistBuddy

PlistBuddy是Mac自带的专门解析plist的小工具,由于PlistBuddy并不在Mac默认的Path里,所以我们得通过绝对路径(/usr/libexec/PlistBuddy)来引用这个工具。

2. Shell基本语法

  1. 定义变量时,变量名不加美元符号$ (PHP语言中变量需要)。如:
    your_name=“runoob.com” (注意:变量名和等号之间不能有空格)
  2. 使用一个定义过的变量,只要在变量名前面加美元符号即可。如:
    echo $your_name
  3. 读取plist中某个字段的值,并赋给变量var:
    var=$(/usr/libexec/PlistBuddy -c “Print :字段名” plist文件路径)
  4. 修改plist中某个字段相应的值:
    /usr/libexec/PlistBuddy -c “Set :字段名 值” plist文件路径
  5. Shell的echo指令与PHP的echo指令类似,都是用于字符串的输出。
    命令格式:echo string
  6. Shell脚本没有{}括号,所以用fi表示if语句块的结束。
  7. #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。

iOS开发之Build版本号自增相关推荐

  1. iOS开发之ARC(自动引用计数)

    iOS开发之ARC(自动引用计数) 英文原文:Automatic Reference Counting on iOS 参与翻译(4人): 纶巾客, showme, 李远超, 王宇龙 自动引用计数(AR ...

  2. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  3. (0045) iOS 开发之MBProgressHUD 源码学习

    (0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1.  学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...

  4. (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接

    1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...

  5. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  6. IOS开发之MD5加密和钥匙串的使用-oc

    IOS开发之MD5加密和钥匙串的使用-oc 源码在我的主页,md5加密是用户登录安全的一个保障.不可逆的,可以暴力破解的. // // ViewController.m // MD5演练 // // ...

  7. IOS开发之CALayer基本属性和使用

    IOS开发之CALayer基本属性和使用 // // ViewController.m // CALayer // // Created by 鲁军 on 2021/2/21. //#import & ...

  8. ios开发之plist 的文件的读写以及沙盒容器路径打印

    ios开发之plist 的文件的读写以及沙盒容器路径打印 核心代码在这里 // // ViewController.m // 21-plist存储和沙盒路径 // // Created by 鲁军 o ...

  9. IOS开发之JSON文件的读写

    IOS开发之JSON文件的读写 // // ViewController.m // 20-JSON的读写 // // Created by 鲁军 on 2021/2/13. //#import &qu ...

最新文章

  1. SAP PM入门系列29 - IW65 Display Activities
  2. 20170512 Python练习册0004统计英文的纯文本文件的单词出现的个数
  3. 习题6-2 使用函数求特殊a串数列和 (20 分)
  4. ElasticSearch6.3脚本更新
  5. 论文阅读笔记(三)【ACL 2021】Locate and Label: A Two-stage Identifier for Nested Named Entity
  6. 1.9 _07 不与最大数相同的数字之和 python
  7. 关于数据库中有自增主键时如何插入数据?
  8. 聚合maven+spring-boot打包可执行jar
  9. php 实现两变量值对换,PHP互换两个变量值的方法(不用第三变量)
  10. 新手小白python数据清洗代码_5天10分钟,学会数据清洗!(Python)
  11. 高职高考计算机网课app,本人准备高职高考,但是初中数学基础不行,所以求一套不错的初中数学练习题,教材的话我就刷网课。...
  12. 矩孔菲涅尔衍射 matlab,圆孔矩孔的菲涅尔衍射模拟(matlab实现)-工程光学
  13. 维宏控制卡win7 驱动_ncstudio(维宏控制系统)64位下载v5.4.86[百度网盘资源] - 软件学堂...
  14. 计算机自检报错无法开机,电脑开机不自检无显示是怎么回事?
  15. 8、Map存储世界杯信息相关操作
  16. Verilog rst
  17. SEO与SEM是什么?有何区别?
  18. python青少年编程_机器人Python青少年编程开发实例
  19. 如何解决百度云下载大文件限速问题
  20. LeetCode 695.岛屿的最大面积

热门文章

  1. 2019 MySQL8 24小时快速入门(2)
  2. 记bilibili 2021 1024程序员节安全攻防挑战赛
  3. win10 xp共享文件夹互访问题解决
  4. MAC下SSL通讯问题、解决办法
  5. 微信网页下载无效 微信无法打开分享的链接的解决方案
  6. 7、【STM32】独立看门狗和窗口看门狗(IWDG、WWDG)实验
  7. Linux操作系统——磁盘管理
  8. 重磅分享:微软面试100题2010年版全部答案完整亮相
  9. 【AI2 THOR】环境使用说明
  10. Unity CPU优化卡顿