APP开发过程中,往往需要在多个网络环境或配置中进行切换,以获取不同配置的APP,甚至有时需要用一套代码经过简单的配置生成不同的APP。而手动配置费时费力,且容易出错。这里介绍用脚本工具,去生成不同配置的APP工程。

1. 需求分析

在配置工程中我们需要事先知道有哪些配置项:

  1. APP 启动图、图标等资源文件。
  2. APP 名称、版本号、bundleID。
  3. APP 相关的微信 APPKey、scheme。
  4. 网络环境、部分代码替换。
  5. provisioning profile 修改

分析以上需要配置的项,我们可以发现这些配置项可以分为三类,分别是:

  1. 资源文件替换
  2. plist 字段修改
  3. 部分代码替换

接下来介绍如何实现满足以上需求的Shell脚本。

2. 脚本设计&实现

2.1 创建脚本

  首先创建一个shell脚本文件,在命令行工具中输入touch xxx.sh就可以创建shell脚本文件,在这里将shell脚本命名为:projectDeploy.sh

  运行脚本时在命令行工具中切换到脚本文件所在的路径,输入:sh projectDeploy.sh命令就可以运行脚本了。

2.2 脚本传参

我们需要传入参数告诉脚需要的具体配置,shell 脚本传入参数的方式有多种,这里只介绍一种:

while getopts ":e:s:" opt

do
case $opt in
e)
environment=$OPTARG;; s)
supplier=$OPTARG;; ?)
echo "请输入正确的参数"
exit 1;;
esac
done

这里定义了两个全局变量 environmentsupplier,当调用脚本时,输入命令 sh projectDeploy.sh -e prd -s xxx

这种传参的好处是,指定了具体变量对应的值,不必保持参数的顺序。

2.3 资源替换

  资源替换这里使用了shell脚本里的 copy 命令:

cp source_file_directory destination_directory

将要替换的资源文件复制到指定位置,有时需要事先将路径下的文件清理一下再进行copy 操作:

rm -rf destination_directory

  如果有同名文件存在,copy操作会覆盖原文件。

  这一操作可以用来替换启动图、桌面图标、图片资源、SDK、代码文件等文件类替换需求。

2.4 plist 字段修改

APP桌面名称版本号bundleIDscheme等等plist 内的值需要替换,

这里我们使用 MAC 自带的plist 文件编辑工具 PlistBuddy 来实现plist文件的维护,

这个工具的访问路径为:/usr/libexec/PlistBuddy

具体命令为:

/usr/libexec/PlistBuddy -c "set CFBundleIdentifier com.xxx.xxx" ${project_infoplist_path}
/usr/libexec/PlistBuddy -c "set CFBundleShortVersionString ${appVersion}" ${project_infoplist_path}
/usr/libexec/PlistBuddy -c "set CFBundleDisplayName xxx" ${project_infoplist_path}

scheme 值修改

  因为 scheme 的数据结构为 数组元素可能是字典,字典key对应的value可能是数组,因此需要事先知道要修改的值的数据结构和位置,在使用 plist 工具时指定字典对应的key,数组对应的下标:

/usr/libexec/PlistBuddy -c "set CFBundleURLTypes:0:CFBundleURLSchemes:0 xxx.xxx.xxx" ${project_infoplist_path}

  以上命令的意思是取 CFBundleURLTypes 数组下的第一个元素 X,再取 X 下 CFBundleURLSchemes 数组下的第一个元素 Y,并更新Y的值为xxx.xxx.xxx

  至于 provisioning profile 的替换,只需要在打包脚本里去指定就可以了,至于project.pbxproj文件的一些配置,也可以用 2.5 的方法去配置,见下一部分。

2.5 部分代码替换

  假如需要修改代码里的部分字符,或批量修改某个变量名称,这里就用到了 sed 命令.

这里讲一个 sed 命令的用法,如果有其他特殊需求,可查询sed 命令的其他用法:

sed -i '' 's/^\#define XXX_XX_URL.*$/\#define XXX_XX_URL  @\"www.junziboxue.com\"/g' ${configureFile}

  这个命令的意思是,匹配所有 #define XXX_XX_URL 宏,然后替换为 #define XXX_XX_URL @"www.junziboxue.com",这里是整行替换。shell 命令里需要对一些特殊字符进行转义,在这里需要注意。

^\#define XXX_XX_URL.*$ 是一个正则表达式,表示所有 以 #define XXX_XX_URL 开头的字符,/g表示全局替换。

具体 sed 的其他用法可自行查询。

3 总结

  在掌握以上方法后,我们基本可以任意配置一份代码工程,修改其一些APP的基本配置。

假如要配置的项很多,可能导致脚本非常臃肿,面对这样的情况,我们需要设计一下脚本的结构:

  我们可以把要配置的项剥离出来,然后设计一个函数执行具体配置,然后在函数内传入参数去指定具体的配置。

或者将配置项事先写好,然后让函数取读就可以了。

script_demo

使用 shell 脚本配置 iOS 工程的更多相关文章

  1. 使用脚本删除ios工程中未使用图片

    使用脚本删除ios工程中未使用图片 最近在读唐巧大神的<iOS开发进阶>,学到了一个大招:使用脚本删除ios中未使用的图片(纸书上有点小问题,参考github上的issue:使用脚本删除i ...

  2. shell脚本配置ssh免密登陆

    通过shell脚本配置免密登陆,分为两个脚本,一个是配置文件config.env,一个是正式脚本sshkey.sh. # config.envexport HOST_USER=(root) expor ...

  3. shell脚本配置maven

    #!/bin/bash # maven install mvnpath=/usr/local/maven # 不存在 if [ ! -d "$mvnpath" ]; then ec ...

  4. ios外包公司—北京动点软件分享:IOS工程自动打包并发布脚本实现

    前言 IOS的开发过程中,当需要给测试人员发布测试包的时候,直接使用xcode来做的效率是非常低下的.尤其是当有一点小改动需要重新出包时,那简直是个折磨的人的工作.通过一番研究后,遂决定写一系列脚本, ...

  5. iOS使用shell脚本注入混淆内容

    背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,其中有一种解决方案是在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝,本文是针对这个场 ...

  6. IOS工程自动打包并发布脚本实现

    http://blog.csdn.net/ccf0703/article/details/8588667 文章首发地址:http://webfrogs.me/2013/02/18/ios-automa ...

  7. iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上-b

    用fir.im测试已经好长时间了,感觉每次打包上传都很麻烦,想着是不是可以用脚本自动打包,在网上搜了一下确实有,下面总结一下如何使用脚本自动打包上传到fir.im,以及打包过程中遇到的问题和解决办法 ...

  8. springboot打包不同环境配置与shell脚本部署

    本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...

  9. iOS shell脚本打包

    原文链接:http://www.jianshu.com/p/5abbe0d61cef 参考链接:http://blog.csdn.net/potato512/article/details/52176 ...

随机推荐

  1. 如何上传本地jar至远程仓库供其他项目使用

    我们首先需要创建自己内部nexus私服仓库.这里假设你已经做好了. 其次我们要明白nexus上如下几个component的用处. maven-central:maven中央库,默认从https://r ...

  2. Web自动化遇到shadowDOM节点操作(还没试)

    近期有同学在做web自动化的时候,发现页面上有些元素,在selenium中无法通过xpath来定位,各种原因找了半天,都没找到解决方案. 最后发现元素在一个叫做shadow-root的节点下面. 如下 ...

  3. Jmetal设置Solution Variables

    Jmetal设置Solution Variables 觉得有用的话,欢迎一起讨论相互学习~Follow Me 首先每个solution都必须使用Problemset初始化 ProblemSet pro ...

  4. 自动以读写方式挂载ntfs(新)-苹果之路

    之前的mac下挂载ntfs磁盘的方法在新版本的macos下失效了:<自动以读写方式挂载ntfs-黑苹果之路>,现提供一个有效的方法,系统版本:白苹果10.14.6,参见<Mac OS ...

  5. JAVA中try、catch、finally带return的执行顺序总结

    异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的.即,如果try中没有异常,则顺序为try→finally,如果try中有异常,则顺序为try→catch→final ...

  6. Javacript Remove Elements from Array

    參考自: https://love2dev.com/blog/javascript-remove-from-array/ 1. Removing Elements from End of Array ...

  7. 贴子详情接口偶发时延超过2s的问题

    1. 发现问题     1. 查询慢access日志,发现偶尔有接口时延超过2s,发送概率1%左右 2. 排查     1. 写单元测试,多次测试后,不能重现问题     2. 接口代码里加日志,每隔 ...

  8. sk-learn 选择正确的估算器

    选择正确的估算器 解决机器学习问题最困难的部分通常是为工作找到正确的估算器. 不同的估计器更适合于不同类型的数据和不同的问题. 下面的流程图旨在为用户提供一些关于如何处理有关哪些估算器尝试数据的问题的 ...

  9. [转] 这个常识很重要,教你如何区分JEDEC 1600内存与XMP 1600内存

    [ 本主题由 围观分子803 于 2016-03-01 20:14:26 设为精华1,原因:主题新颖,支持知识普及! ] 最后由 幻尘 于 2016-03-01 11:57:15 修改 也许一些DIY ...

  10. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...