使用 shell 脚本配置 iOS 工程
APP开发过程中,往往需要在多个网络环境或配置中进行切换,以获取不同配置的APP,甚至有时需要用一套代码经过简单的配置生成不同的APP。而手动配置费时费力,且容易出错。这里介绍用脚本工具,去生成不同配置的APP工程。
1. 需求分析
在配置工程中我们需要事先知道有哪些配置项:
- APP 启动图、图标等资源文件。
- APP 名称、版本号、bundleID。
- APP 相关的微信 APPKey、scheme。
- 网络环境、部分代码替换。
- provisioning profile 修改
分析以上需要配置的项,我们可以发现这些配置项可以分为三类,分别是:
- 资源文件替换
- plist 字段修改
- 部分代码替换
接下来介绍如何实现满足以上需求的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
这里定义了两个全局变量 environment
和 supplier
,当调用脚本时,输入命令 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桌面名称
、版本号
、bundleID
、scheme
等等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的基本配置。
假如要配置的项很多,可能导致脚本非常臃肿,面对这样的情况,我们需要设计一下脚本的结构:
我们可以把要配置的项剥离出来,然后设计一个函数执行具体配置,然后在函数内传入参数去指定具体的配置。
或者将配置项事先写好,然后让函数取读就可以了。
使用 shell 脚本配置 iOS 工程的更多相关文章
- 使用脚本删除ios工程中未使用图片
使用脚本删除ios工程中未使用图片 最近在读唐巧大神的<iOS开发进阶>,学到了一个大招:使用脚本删除ios中未使用的图片(纸书上有点小问题,参考github上的issue:使用脚本删除i ...
- shell脚本配置ssh免密登陆
通过shell脚本配置免密登陆,分为两个脚本,一个是配置文件config.env,一个是正式脚本sshkey.sh. # config.envexport HOST_USER=(root) expor ...
- shell脚本配置maven
#!/bin/bash # maven install mvnpath=/usr/local/maven # 不存在 if [ ! -d "$mvnpath" ]; then ec ...
- ios外包公司—北京动点软件分享:IOS工程自动打包并发布脚本实现
前言 IOS的开发过程中,当需要给测试人员发布测试包的时候,直接使用xcode来做的效率是非常低下的.尤其是当有一点小改动需要重新出包时,那简直是个折磨的人的工作.通过一番研究后,遂决定写一系列脚本, ...
- iOS使用shell脚本注入混淆内容
背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,其中有一种解决方案是在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝,本文是针对这个场 ...
- IOS工程自动打包并发布脚本实现
http://blog.csdn.net/ccf0703/article/details/8588667 文章首发地址:http://webfrogs.me/2013/02/18/ios-automa ...
- iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上-b
用fir.im测试已经好长时间了,感觉每次打包上传都很麻烦,想着是不是可以用脚本自动打包,在网上搜了一下确实有,下面总结一下如何使用脚本自动打包上传到fir.im,以及打包过程中遇到的问题和解决办法 ...
- springboot打包不同环境配置与shell脚本部署
本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...
- iOS shell脚本打包
原文链接:http://www.jianshu.com/p/5abbe0d61cef 参考链接:http://blog.csdn.net/potato512/article/details/52176 ...
随机推荐
- C# INI配置文件读写类
ini是一种很古老的配置文件,C#操作ini文件借助windows底层ini操作函数,使用起来很方便: public class IniHelper { [DllImport("kernel ...
- SQL Server:时间范围查询重叠
常常碰到要校验数据范围是否存在重叠冲突的情况,典型的场景是房间预订. 假如房间A已经有9月1日-9月10日的预订记录,当其它客人再来预订时,系统必须判断,不能与这个日期范围产生重叠. 有四种情况会产生 ...
- PostgreSQL的递归查询(with recursive) ,替代oracle 的级联查询connect by
开发有需求,说需要对一张地区表进行递归查询,Postgres中有个 with recursive的查询方式,可以满足递归查询(一般>=2层). 测试如下: create table tb(id ...
- C# 发送Post请求(带参数)
此处内容传输都是用UTF-8编码 1.不带参数发送Post请求 /// <summary> /// 指定Post地址使用Get 方式获取全部字符串 /// </summary> ...
- Centos7.3之K8S安装初体验
容器是发展趋势,所以是时候从虚拟机中脱离出来,投入到容器化的怀抱中了. 曾经试过安装k8s,都没有成功,各种乱七八糟的报错,于是一拖再拖,这次总算发现一个可以快速部署的工具,终于安装成功了. 这个k8 ...
- sourceTree安装和使用(windows)
SourceTree的简介 SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subve ...
- snapde的批量文件数据过滤保存功能
一.snapde基本介绍 Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它运行的速度非常快,反应非常灵敏. 二.snapde批量数据筛选功能 如果想要对很多文件筛选出来 ...
- mybatis异常集锦
[Mybatis]报错:Malformed OGNL expression: name!= null and name != ' ' [Mybatis]报错:Malformed OGNL expres ...
- zuul 熔断后重试
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring ...
- 修复Nginx报错:upstream sent too big header while reading response header from upstream
在 nginx.conf 的http段,加入下面的配置: proxy_buffer_size 128k; proxy_buffers 32k; proxy_busy_buffers_size 128k ...