资讯专栏INFORMATION COLUMN

打几个不一样的iOS包

huhud / 1075人阅读

摘要:打几个不一样的包引言公司项目重构之后,有了相对比较完善的开发体系,首先分支分为日常预发生产三个主要分支,开发阶段都在日常分支下开相应功能的分支,开发完再合并。

打几个不一样的iOS包 引言

公司项目重构之后,有了相对比较完善的开发体系,首先git分支分为日常、预发、生产三个主要分支,开发阶段都在日常(daily)分支下开相应功能的feature分支,开发完再合并。

我的iOS工程需要满足这个开发体系,那么我必须能实现以下诉求:

构建不同的宏来方便切换相应的配置;

配置三种数据环境根据宏的切换进行切换;

三种图标/应用名称根据宏的切换进行切换显示;

至少两个类型的包能同时安装在手机上;

最好能使用脚本实现自动化打包放入bugly或者蒲公英等平台供内部测试人员下载;

网上已经有很多类似的讲解,但是我发现这其中还是会遇到一些意想不到的问题,比如pods工程的相应配置、应用名与".strings"文件的冲突、使用命令行打包 等等问题,下面我将整个配置方法以及其过程中遇到的问题及解决方案分享出来,这也是本文的主要用意,以供大家参考和我自己温故。
Demo切换Configuration能同时安装在一个手机上三种版本:

Demo在这里=>>CreateIpaDemo

勘误

因为日前iPhone 7的发布,题主提前下载了Xcode 8 beta版,将公司项目在iOS 10上面跑了一下,发现了很多的变动(例如:基本上所有的系统权限都需要在info.plist中声明、导航栏透明度动态设置问题),其中与本文相关的一个问题在此说明一下:

正文中的的五、配置不同的Bundle ID在使用User-Defined方式在Xcode 8 beta中设置无效,其实跟图标一样,在Target的Build Setting下的Packaging中同样有默认的设置项,我们可以根据自己的需要设置各种scheme下的配置不同的Bundle ID,如下图:

正文

首先,我们都知道iOS设备上的App是根据AppID也就是工程中的Bundle ID来识别App的。默认Xcode为每个target提供2个Build配置项(Build Configuration):Debug和Release。

一、创建多个Configuration

如下图,有两种方法可以用来创建我们需要新增的Build Configuration,这里新建一个名为Preform的配置项,是为了满足App的开发环境(Debug)、预发环境(Preform)、线上环境(Release)三套数据环境的切换。

二、数据环境的配置

上面新增了Preform配置项之后,可以在当前Target的Build Setting下搜索macros找到Preprocessor Macros,可以看到我们刚刚Duplicate "Release"生成的Preform的Multiple Value与Release的一模一样,这里我们需要新增PREFORM=1,来定义标示预发环境的宏变量PREFORM,主要是为了方便我们根据这里生成的宏在.pch文件中利用#ifdef来配置好相应的数据环境,这里同样可以将一些需要区分环境的第三方配置放进来,示意图及环境配置代码如下:

#ifdef DEBUG //开发环境

#define EMKEY   @"emdevkey" //环信key
#define EMAPNS   @"emdevapns" //环信secret
#define SERVER_HOST @"http://api.dev.zhujiamin5@yeah.net/"
#define WEB_HOST @"http://h5.dev.zhujiamin5@yeah.net/"

#elif PREFORM //预发环境

#define EMKEY   @"emdiskey"
#define EMAPNS   @"emapns"
#define SERVER_HOST @"http://api.dis.zhujiamin5@yeah.net/"
#define WEB_HOST @"http://h5.dis.zhujiamin5@yeah.net/"

#else //正式环境

#define EMKEY   @"emdiskey"
#define EMAPNS   @"emapns"
#define SERVER_HOST @"http://api.dis.zhujiamin5@yeah.net/"
#define WEB_HOST @"http://h5.dis.zhujiamin5@yeah.net/"

#endif

需要注意的问题:

正常情况下,以上步骤完成之后,如上图选择Edit Scheme切换Build Configuration就能编译出相应环境下的App,但是如果你的App使用pods来管理第三方库,使用新建的配置项就会报错找不到第三方的库文件,错误信息类似如下:

原因是pods工程并未自动帮我们创建相应的pod配置项,发现这一点之后我手动创建了一个同样名为Preform的pod配置项,于是编译通过了,但是打ipa包的时候始终通不过,继续查找原因,原来xcconfig文件需要终端执行pod install进行全面配置,所以大家在新建完了之后记得要pod install一下,才能放心使用。

三、配置不同的AppIcon

配置AppIcon有两种必比较方便的方法。

第一种:

首先我们需要找UI设计师要三套不一样的图标,如下图这样取好对应的名称放入Assets.xcassets中:

然后再当前Target的Build Setting下搜索icon找到Asset Catalog App Icon Set Name,然后进行如下配置:

然后Edit Scheme选择相应的Configuration进行编译或者打包就能打出不同的图标了。

第二种

使用User-Defined配置三种Configuration下的变量,在info.plist中进行配置,配置方法与下面的应用名称配置类似,这里不做过多描述。

四、配置不同的AppName

配置不同的应用名称,这里需要使用到User-Defined加上info.plist来进行配置;
首先,我们需要新增一个User-Defined,如下图:

将三种Configuration下的应用名分别设置成:Demo开发版、Demo预发版、Demo。
然后在info.plist中加入Bundle display name,将其设置成我们刚刚新建的User-Defined:

需要注意的问题:

如果你的不小心引入了别的工程的InfoPlist.strings文件,它里面配置的bundle display name设置会覆盖掉你的User-Defined,使你的设置没有作用。

五、配置不同的Bundle ID

为了使打出来的三种包能够共同存在同一台手机上,我们需要像配置应用名称一样,新建一个User-Defined来根据不同的Configuration使用不同的Bundle ID打包。
配置方法与配置应用名称一致这里也过多描述。

配置完成之后,同一个App就能够在一台手机上面安装多个不同的包啦!

六、脚本打包

在这里推荐大伙儿一个工具,CLI for Building & Distributing iOS Apps (.ipa Files),类似的自动打包工具有很多,这个目前能满足我的需求,上手很快,安装之后一行代码即可打出想要的ipa包,后面再抽时间详细总结一下jenkins+这个工具的使用方法。

最后

分享就先到这里喽,欢迎各位看官的指正~

最近项目刚刚重构完成,后续我会陆续把重构过程中遇到的问题及解决方案分享出来,和大家互相交流学习。

本人坐标杭州,QQ:815187811,欢迎结交[笑脸].

参考链接:
http://blog.sina.com.cn/s/blo...
http://www.devzeng.com/blog/i...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16421.html

相关文章

  • 业务开发中调试方法总结

    摘要:业务开发中的调试方法总结这段时间,接触了单元测试,同时业务中遇到了一些需要排错调试的情况,就把自己的经验做个小结。但是如果你的业务经常变化,但是变化的部分并不会影响单元测试,那这种情况下的单元测试性价比就很高。 业务开发中的调试方法总结 这段时间,接触了单元测试,同时业务中遇到了一些需要排错调试的情况,就把自己的经验做个小结。 3种调试方法 狼叔说,常见的三种调试的境界 初级: 打l...

    KaltZK 评论0 收藏0
  • java通过smtp服务 给指定邮箱发送邮件含附件

    摘要:其中部分第三方邮箱可以实现用自己的域名来接发邮件,例如本文中介绍的是第二种方法,用腾讯企业邮箱为例参考借鉴的大神的原文地址这里重点只说明一下,腾讯企业邮箱来实现发邮件,代码的部分。 showImg(https://upload-images.jianshu.io/upload_images/15934130-069b1424fde38763.png?imageMogr2/auto-or...

    mingzhong 评论0 收藏0
  • 前端模块化——技术选型

    摘要:前言前端模块化,主要是解决两个问题命名空间冲突,文件依赖管理。目前解决的方法是模块化命名空间各个模块的命名空间独立。模块化构建工具,等是用来组织前端模块的构建工具加载器。 前言 前端模块化,主要是解决两个问题——命名空间冲突,文件依赖管理。 坑___命名空间冲突 我自己测试好的代码和大家合并后怎么起冲突了? 页面脚本的变量或函数覆盖了公有脚本的。 坑___文件依赖管理 明明项目需...

    Doyle 评论0 收藏0
  • JS之数组个不low操作(3)

    摘要:序列文章面试之函数面试之对象前言本文主要从应用来讲数组的一些骚操作如一行代码扁平化维数组数组去重求数组最大值数组求和排序对象和数组的转化等上面这些应用场景你可以用一行代码实现扁平化维数组终极篇是扁平数组的表示维度值为时维度为无限大开始篇实质 showImg(https://segmentfault.com/img/bVbpRMS?w=1858&h=1286); 序列文章 JS面试之函数...

    fish 评论0 收藏0
  • React中“虫洞”——Context

    摘要:理论上,通过一层层传递下去当然是没问题的。不过这也太麻烦啦,要是能在最外层和最里层之间开一个穿越空间的虫洞就好了。使用看起来很高大上的使用起来却异常简单。就像中的全局变量,只有真正全局的东西才适合放在中。 当我们写React时,我们总是通过改变State和传递Prop对view进行控制,有时,也会遇到一点小麻烦。 背景 但是随着我们的应用变的越来越复杂,组件嵌套也变的越来越深,有时甚至...

    muddyway 评论0 收藏0

发表评论

0条评论

huhud

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<