使用 Xcode 和 Android Studio 管理 iOS 和 Android 项目版本

在移动应用开发和运营的过程中,版本管理是一个老生常谈的基础问题,一些版本的基本概念也常常会困扰我们的研发和运营人员。同时,手动管理软件版本,也常常会因为不小心导致后续的发布和更新问题。

这里,我准备了一些 iOS 和 Android 版本的基础知识,以及如何在应用中获取版本信息和如何使用 Xcode 和 Android Studio 自动管理版本号。

版本号解释

无论是 iOS 还是 Android 都定义了两个版本属性:

  • iOS
    在 Info.plist 中定义

    • CFBundleShortVersionString
      在Xcode中解释为 Version ,这个就是我们常说的版本号,一般用户可见,通常由 <主版本号>.<次版本号>.<维护号> 三部分组成,主要用来识别不同时期不同功能的产品。
    • CFBundleVersion
      在Xcode中解释为 Build ,一般用于应用市场和程序内部识别版本,作为更新判断的依据,通常是一个递增的 INT 类型。

      这两个值可以在 Xcode 的项目信息里面进行管理,

      img_01.png

      当然,你也可以直接编辑 Info.plist

  • Android
    在 AndroidManifest.xml 中定义
    • android:versionName
      对应 iOS 中的 CFBundleShortVersionString 版本号,用作产品管理。
    • android:versionCode
      对应 iOS 中的 CFBundleVersion 编译号,作为内部识别。

      在使用 Eclipse 开发时,可以通过直接编辑 AndroidManifest.xml 文件修改,在使用 Android Studio 时,这些信息由 Gradle 脚本管理,找到并打开项目目录下 app 目录内的 build.gradle 文件,版本信息在 defaultConfig 段,

      img_02.png

程序内获取版本信息

一般在应用的关于页面,我们都会显示应用的版本,方便客服定位问题,在应用检查更新时,也常常需要用到版本信息。其实,无论是在 iOS 上,还是 Android 平台,获取笨笨信息都比较简便:

  • iOS
    索引 Bundle 信息中的相关字段:

      NSBundle *bundle = [NSBundle mainBundle];
      NSString *name = [[bundle localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"];
      NSString *version = [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
      NSString *build = [bundle objectForInfoDictionaryKey:@"CFBundleVersion"];
    
      NSString *fullVersion = [NSString stringWithFormat:@"version: %@ (%@)", version, build];

    上述的代码中,name 为本地化的程序名称,version 为版本号,build 为编译号,‘fullVersion‘ 则将版本号和编译号组成一个完整的版本信息。

  • Android
    获取 PackageInfo 中的相关信息:
      PackageInfo pi = sContext.getPackageManager().getPackageInfo(sContext.getPackageName(), 0);
      String versionName = pi.versionName;
      int versionCode = pi.versionCode;
    
      String fullVersion = String.format("version: %s (%d)", versionName, versionCode);

    同样,versionName 为版本号,versionCode 为编译号,不同的是,在 Android 中 versionCode 使用 int 类型存储。

Xcode 和 Android Studio 编译号自增

一般应用的 版本号 都会由 产品经理 或 项目经理 决定,根据产品所处的阶段和功能决定修改版本号的哪一个段。但 编译号 更多时候是根据每次发布递增,有时候还会遇到同一个版本号对应多个编译号的情况,如,紧急修复了一个关键 Bug 并更新发布一个版本,但如果每次发布都要手动去修改编译号回很繁琐,也很容易忘记和出错,而不管是 Xcode 还是 Android Studio 都没有提供自增编译号的功能,我们只有手动添加编译脚本来达到自增的目的。

  • Xcode
    添加编译过程,读取并修改 Info.plist 中的版本信息:

    1. 打开工程,选择编译目标,点击 Build Phases 选项卡。

      img_03.png

    2. 点击左上角的 + 添加,选择 New Run Script Phase 添加一个编译脚本。

      img_04.png

      img_05.png

    3. 在脚本编辑其中输入下面的脚本:
       #!/bin/bash
       buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
       buildNumber=$(($buildNumber + 1))
       /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

      上述脚本使用 PlistBuddy工具,读取 Info.plist 中的 CFBundleVersion 值,+1 后写回 Info.plist 中。

    4. 我们需要让该段代码在应用打包前执行,以便将修改应用到App包内,因此我们将该编译过程重命名为 Increase Version Code 并移动到 Copy Bundle Resources之前。

      img_06.png

    5. 这样,当我们每次编译该 Target 时 ,就会执行改脚本将 CFBundleVersion 值增加1,但没次调试运行时,该值都会加1,这并不是我们想要的,我们只需要在每次打包发布时增加1就行,因此,我们将 Run script only wehn installing 前的勾打上,这样就只会在打包应用时执行改脚本。

      img_07.png

  • Android Studio
    Android Studio 的 versionCode 自增原理和 Xcode 类似,不同的是我们不能让编译脚本修改自身,而是通过一个额外的 Java Properties 来文件存储版本信息:
    1. 打开工程,选择 Module: app 的编译脚本 build.gradle

      img_08.png

    2. 找到 defaultConfig 段,替换为下面的脚本:
       def versionPropsFile = file(‘version.properties‘)?
       if (versionPropsFile.canRead()) {?
           Properties versionProps = new Properties()?
           versionProps.load(new FileInputStream(versionPropsFile))??
      
           def verCode = versionProps[‘VERSION_CODE‘].toInteger()?
           versionProps[‘VERSION_CODE‘] = (++verCode).toString()?
           versionProps.store(versionPropsFile.newWriter(), null)??
      
           defaultConfig {?
               applicationId "com.example.versionexample"?
               minSdkVersion 19?
               targetSdkVersion 23?
               versionCode verCode?
               versionName "1.0.1"?
           }?
       } else {?
           throw new GradleException("Could not read version.properties!")?
       }

      这段脚本会打开 app 目录下的 version.properties 配置文件,读取 VERSION_CODE 字段并增加1后写回,同时将值赋给 defaultConfig 中的 versionCode 。

    3. 此时,点击 Sync 会报错 Could not read version.properties!,这是我们刚刚在脚本中抛出的,原因是找不到 version.properties 文件,我们需要新建一个。打开命令行定为到项目目录下:
       $ cd app/
       $ echo "VERSION_CODE=1" > version.properties

      再次点击 Sync 就不会报错了。查看 version.properties 文件,

       $ cat version.properties
       #Mon Nov 02 15:18:49 CST 2015
       VERSION_CODE=3

      发现 VERSION_CODE 已经增加到 3 了,说明该脚本被执行了两次,但这并不符合我们的预期。

    4. 同 Xcode 中一样,我们期望仅仅在应用打包时将 versionCode 增加 1 。因此我们需要获取编译参数,仅当 release 时才将 versionCode 增加 1 。修改后的脚本如下:
       def versionPropsFile = file(‘version.properties‘)?
       if (versionPropsFile.canRead()) {?
          Properties versionProps = new Properties()?
          versionProps.load(new FileInputStream(versionPropsFile))??
      
          def verCode = versionProps[‘VERSION_CODE‘].toInteger()?
      
          def runTasks = gradle.startParameter.taskNames
          if (‘:app:assembleRelease‘ in runTasks) {
             versionProps[‘VERSION_CODE‘] = (++verCode).toString()
             versionProps.store(versionPropsFile.newWriter(), null)
          }
      
           defaultConfig {?
               applicationId "com.example.versionexample"?
               minSdkVersion 19?
               targetSdkVersion 23?
               versionCode verCode?
               versionName "1.0.1"?
           }?
       } else {?
           throw new GradleException("Could not read version.properties!")?
       }

      这里获取当前task的名称,仅当task包含 :app:assembleRelease 时才会将 versionCode 加 1 ,否则直接使用读取到的值。

小结

版本管理是产品和项目管理中非常重要的一环,但在开发初期也常常容易被忽略,等到遇到问题时候才感到头痛。其实,产品经理和开发人员在产品的立项阶段就应该对产品版本有一个一致的理解,我个人通常在项目框架建立之初就将这些规则脚本添加到项目文件中,以期降低后续版本维护的成本。

时间: 2025-01-15 09:46:34

使用 Xcode 和 Android Studio 管理 iOS 和 Android 项目版本的相关文章

Android Studio之同一窗口打开项目

Android Studio默认新打开的项目都是重新打开一个窗口,和原项目窗口同时存在,如果打开多个项目,则有很多窗口同时打开,怎么根据需要决定自己以何种方式打开呢? 1.设置打开新项目的方式 第一项是系统默认的,即每次打开新窗口 第二项表示,每次打开项目都在当前窗口 第三项表示,每次打开都会询问用户以前面两种哪种方式打开(推荐) 如果不希望提示,可以选择第二项 2.打开新的项目 如果之前打开过其他项目,则点击“File-Reopen Project”,后面会列出常用的项目名称,选择其中一个打开

android studio教程-创建第一个项目Hello World

我的博客中的原文:http://www.qiuqiu77.com/android-studio-hello-word.html 在前面文章讲了android开发环境的部署,那么我们用hello world和android studio打声招呼吧! 第一步,打开android studio 输入你的项目名称"Hello World". "Company Domian":暂时你就随便填一个吧! "Project Location":你应该新建一个目录

【转】如何使用Android Studio把自己的Android library分发到jCenter和Maven Central

转自:http://www.devtf.cn/?p=760&utm_source=tuicool 如何使用Android Studio把自己的Android library分发到jCenter和Maven Central 原文链接 : How to distribute your own Android library through jCenter and Maven Central from Android Studio 译文出自 : 开发技术前线 www.devtf.cn与 泡在网上的日子

修改Android Studio默认的API Level(SDK版本)

原文:修改Android Studio默认的API Level(SDK版本) Android Studio(2.1.2)新建工程的时候只会让你选择最低支持的SDK版本,默认的目标编译SDK版本会以系统当前SDK中最新SDK platform作为目标的API Level.但是很多时候我们并不需要最新的SDK版本,如何修改呢? 方法是:修改工程目录中的Gradle Scripts->build.gradle(Module:app)中的相关行,具体见下图: 当然也可以图形化操作,右键工程目录选择"

Android Studio常用快捷键、Android Studio快捷键大全

Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试,基于Gradle的构建支持. Android Studio常用快捷键 1. Ctrl+D: 集合了复制和粘贴两个操作,如果有选中的部分就复制选中的部分,并在选中部分的后面 粘贴出来,如果没有选中的部分,就复制光标所在的行,并在此行的下面粘贴出来. 2. Ctrl+空格: 输入代码时按此组合键会列

ArcGIS4Android 1:使用Android Studio进行ArcGIS for Android开发的环境部署-正确版

按照许多方法尝试配置环境,均不能显示地图,模拟运行时程序直接退出. 最后看到这个博友的配置,缺少了重要的一步:引用so文件. 对于有些人可能不会出问题,我这里反正出问题了. 引用so文件,打开moudle目录下的build.gradle,在android节点下添加如下配置. 注:如果没有正确引入so文件,在程序执行的时候会加载类库失败. ---------------------------原文在下-------------------------------------- 乘风莫邪 使用And

Android Studio安装后Fetching android sdk component information超时的解决方案

问题描述: Android Studio 是一个全新的 Android 开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试. Android Studio安装完成后,如果直接启动,Android Studio会去获取 android sdk 组件信息,这个过程相当慢,还经常加载失败,导致Android Studio启动不起开.解决办法就是不去获取android sdk 组件信息. 解决方法:

android studio开发工具的android library打包文件(.aar)本地引用

by 蔡建良 2014-5-13 关键点: 利用Gradle发布本地maven库支持android library 打包文件(*.aar) 的本地引用 开发环境: windows7 64位操作系统 android studio0.5.8 (1) 安装maven1.在安装maven之前,先确保已经安装JDK1.6及以上版本,并且配置好环境变量.2.下载maven3,最新版本是Maven3.2.1 ,下载地址:http://maven.apache.org/download.html 下载apach

安装android Studio和运行react native项目(基础篇)

ANDROID_HOME环境变量 确保ANDROID_HOME环境变量正确地指向了你安装的Android SDK的路径. 打开控制面板 -> 系统和安全 -> 系统 -> 高级系统设置 -> 高级 -> 环境变量 -> 新建 具体的路径可能和下图不一致,请自行确认. 你需要关闭现有的命令符提示窗口然后重新打开,这样新的环境变量才能生效. 测试安装 react-native init AwesomeProject cd AwesomeProject react-nativ