前言

我还在上一个东家的时候,我现在东家的项目写了几个功能作为外包给我做了,所以没来这家公司的时候我对这个项目就比较熟悉了;前年从上家公司离职后受邀来到现在这家公司了。接手这个APP因为急着上线功能,所以我也没有对APP进行优化,先前是三个程序员开发的,上线以后APP包达到116M,每次运营出去推广下载是个痛苦的事,非常的慢,所以每次运营的小伙伴出去推广,都会带上地推盒子,我每次都会把最新的ipa放到地推盒子里,给运营小伙伴用......说多了都是泪?。所以下决心挤时间来优化安装包。

安装包的优化是个细致漫长的过程,我这里会把我做的事一一描述出来,以供大家参考。这里主要讲的是APP瘦身相关的,如果想了解APP性能优化相关的,欢迎参考我的另一篇博文:

?《iOS-APP性能优化的那些事》?

大文件移除

我们APP开发设计的时候,老总选择的是PingFangSC字体,但是有一个问题就是在iOS9.0以前手机字体库是没有PingFangSC字体库的,这就需要我们手动导入PingFangSC字体库,但是涵盖几个常用的PingFangSC字体库大概有三四十兆,所以这也找出APP包比较大的一个重要原因,但是iOS9.0以后根本又不需要了,所以PingFangSC字体又不是每个包必须的。因此我把PingFangSC字体库拿出来放在公司服务器上,拿到下载链接,让用户下载完成APP以后再在手机里面下载字体库。平方字体参考:

?《 iOS-PingFangSC字体》?

具体处理思路是:我通过runtime写了一个替换fontWithName的方法,里面进行判断如果用户第一次打开APP还是加载系统自带的字体库,然后在APP内下载字体库,下载完成以后解压加载,再打开新的页面就替换上去了。

总结:我们可以把项目中大的资源文件或者包放在服务器上,等APP下载以后在下载下来,这个思路也可以用在更新framework上,参考本人的另一篇文章:

?《 [置顶] iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)》?

图片图标优化

开始项目中的图标文件是被小伙伴们直接放在工程目录下面的,里面有1x、2x和3x的图片,当然打包的时候这些文件也都被打包进去了。我这里做的就比较简单了我把图片放在Xcode自带的图片管理工具里面Images.scasssets,这样的好处就是打包的资源包中的图片会被放到Assets.car.图片有被压缩;此时若用[[NSBundle MainBundle] pathForResource:  ofType: ]来访问时访问不到的。同时你也无法像平常一样轻易的拿到被人的图片资源了,不用再为多像素的图片命名。mages.xcassets会自动的排列不同像素的图片。

还有就是一些常用的小图标,可能样式是一样的,但是就是颜色不一样,这样在工程中也很多;我这里用到iconfont来替换png图标,用起来还简单,不但减小了资源文件的占用空间还方便使用。

最后就是删除工程中不用的icon图标了。

相同功能控件的封装

我们在开发中肯定会遇到相同控件或者功能,也有可能就是不同的UI但是功能差不多。这里面我将距离相同功能相同UI的和相同功能不同UI的两个示例。

a.相同功能和UI

我们把项目中常用的相同功能和UI的部门拿出来封装成一个单独的功能,开发使用直接调用就行了。比如我项目中的点赞和打分控件,点赞是我自定义的一个ZFJPraiseBtn,打分是我自定义的一个ZFJScoreView,封装以后开发者需要使用的时候直接给一个点赞数或者分数的回调就行了,一句代码就搞定。示例图如下:

b.功能相同UI不同

有些东西功能相同的,但是UI不同,比如我的界面有滚动和轮播功能,只需要传入不同的view就行,如下图的头部广告轮播滚动、推荐比赛左右滑动、推荐文章左右滑动:

还有我们的APP类似于微信的朋友圈,可以发图片文字或者视频,对应的列表有全文本、图片0~9张,我只需要写一个统用的cell管理类,传入数据模型model返回cell就行,如下面的方法:

/**Blog列表Cell@param cell HomePostCell@param indexPath indexPath@param model 数据模型*/
- (void)setNewHomePostCell:(HomePostCell *)cell cellForRowAtIndexPath:(NSIndexPath *)indexPath model:(ZFJBlogsModel *)model;

引用如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *identifier = @"HomePostCell";HomePostCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];if(cell == nil){cell = [[HomePostCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier isShowSpace:YES];cell.selectionStyle = UITableViewCellSelectionStyleNone;cell.delegate = self;cell.authorVoiceBubble.delegate = self;cell.replyVoiceBubble.delegate = self;}if(self.dataArray.count>0){[[ZFJViewManager manager] setNewHomePostCell:cell cellForRowAtIndexPath:indexPath model:self.dataArray[indexPath.row]];}return cell;
}

试用APP中所以的帖子类型的列表。

第三方库的精简

第三方库的使用是项目中不可避免的,我们在开发过程中为了节约开发的时间成本和财力成本,我们经常会使用一些第三方库。我们APP在项目中用到IM即时聊天,我们选用的是融云的IM聊天库,融云IM注释详细接入方便,融云IM有IMKit和IMLib两种库,如果你使用融云IM的UI那你就要把这两张库都导入,但是这两种库都导入的话占用不少容量,光磁盘大小就有44M了,但是我们APP的聊天场景比较简单,就是单聊和群聊,所以这里面我删除了IMKit库,在IMLib的基础上自己写聊天UI,这样又精简了不少内存。如下图:

总结:我们在使用第三方库的时候可以根据自己的需求选择性的使用。

基类的使用

基类是每个初学者都应该知道的,当然在开发过程中也是非常实用的,我们把一些常用的或者同样的方法放在基类里面,这样继承基类的类也都能使用。举例:友盟统计方法我写在BaseViewController里面,代码如下:

- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];[MobClick beginLogPageView:self.title];
}- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];[MobClick endLogPageView:self.title];
}

代码精简

代码精简是开发者的思维习惯和开发习惯所决定的,还有就是你的开发年限。比如我现在有一个数组让你来去重,这就要很多种方法了,但是不同的方法所产生的代码就不一样了,但是结果是一样的,比如:

方法A:

NSMutableArray *categoryArray = [[NSMutableArray alloc] init];for (unsigned i = 0; i < [nameArray count]; i++){if ([categoryArray containsObject:[nameArray objectAtIndex:i]] == NO){[categoryArray addObject:[nameArray objectAtIndex:i]];}}

方法B:

NSSet *set = [NSSet setWithArray:arr];NSLog(@"%@",[set allObjects]);

很明显方法二的代码少于方法一,但是达到的效果也是一样的。

还有就是删除无用的代码,APP在开发过程中,因为版本的迭代,时间久了会产生很多无用的类或者代码,这样我会选择删除,如果害怕以后会用得到,你可以选择先备份一份,当然在备份的时候要弄一份备份文档是最好不过的了。

结束语

欢迎各位大神补充和纠正?!

iOS-APP包的瘦身之旅(从116M到现在的36M的减肥之路)相关推荐

  1. iOS App 安装包瘦身指南

    以下列出了安装包瘦身的无脑执行流程,其中"奇技淫巧"部分为选做题 资源优化 删除无用图片 使用LSUnusedResources查找无用图片 删除重复资源 压缩图片资源 使用Ima ...

  2. 【TA-霜狼_may-《百人计划》】图形3.6 纹理压缩——包体瘦身术

    [TA-霜狼_may-<百人计划>]图形3.6 纹理压缩--包体瘦身术 @[TOC]([TA-霜狼_may-<百人计划>]图形3.6 纹理压缩--包体瘦身术 3.6.1 纹理压 ...

  3. Android App安装包瘦身计划

    Android App安装包瘦身计划 Android App安装包体积优化: 理由, 指标和可以采用的方法. 本文内容归纳如下图: 为什么要安装包瘦身 安装包需要瘦身吗? 不需要吗? 安装包要瘦身的主 ...

  4. 【SpringBoot】32、SpringBoot项目Jar包如何瘦身部署

    一.背景 SpringBoot 为我们快速开发提供了很好的架子,使得我们只需要少量配置就能开始我们的开发工作,但是当我们需要打包上传部署时,却是很神伤的一个问题,因为打出来的 Jar 包少则十几兆,多 ...

  5. 基于clang插件的一种iOS包大小瘦身方案

    引子 \ 包瘦身,包瘦身,包瘦身,重要的事情说三遍. \ 最近公司一款iOS APP(本文只讨论使用Objective C开发的iOS安装包)一直在瘦身,我们团队的APP也愈发庞大了.而要解决这个问题 ...

  6. iOS9 App Thinning(应用瘦身)功能介绍

    iOS9 发布后,产生了一个使 App Thinning 无法正常运行的 bug.在iOS9.0.2 版本中,这个 bug 已经被修复,App Thinning 已经可以正常使用.当你从应用商店(Ap ...

  7. 贝壳找房APP安装包瘦身

    一.背景 在满足产品.UI要求的前提下,尽量减少安装包体积. 以customer插件为例: 插件大小为5MB, 其中1MB是dex,而bkbase占了dex的580KB: 3.1MB是图片. 减少re ...

  8. 京东商城iOS客户端安装包瘦身实践

    一.概述 随着业务的快速增加,商城app的大小也在迅速增加,一度超过了300M.安装包大小的不断增加对app下载成本,推广效率产生了比较大的影响.从2018年9月份我们对商城app开始了为期二期的专项 ...

  9. iOS9 App Thinning(应用瘦身)功能介绍 1

    iOS9 发布后,产生了一个使 App Thinning 无法正常运行的 bug.在iOS9.0.2 版本中,这个 bug 已经被修复,App Thinning 已经可以正常使用.当你从应用商店(Ap ...

最新文章

  1. 引入外部css_css
  2. access数据类型百度百科_Access数据库属于什么数据库。
  3. hdu1686 最大匹配次数 KMP
  4. 9.STM32中对SysTick_Init()函数(sysTick_Config()、TimingDelay_Decrement()自定义)和Delay_us()的理解
  5. java8 函数式编程_您必须学习Java 8的函数式编程吗?
  6. [CF671E] Organizing a Race
  7. py导入包异常跳出_python~异常处理及包
  8. 学习笔记6—pandas中ix,loc,iloc有什么区别?
  9. oracle数据库查看建表语句,oracle 查看建表语句
  10. 【Push Kit】模拟服务端发送消息至客户端,测试消息发送功能(华为推送服务)
  11. vue 修改logo实现展示自定义的logo
  12. markdown特殊用法(三) 脚注的输入
  13. 40万亿全球最大资管来A股建仓了交易策略竟是这个
  14. 网络原理考点之ADSL组网技术
  15. Unity3D逻辑热更新,第二代舒爽解决方案,L#使用简介
  16. in作为介词的用法_英语介词丨in、on 、at 的具体用法到底有哪些?
  17. -- 31、查询1990年出生的学生名单
  18. 一个cv大师的摆烂之旅
  19. Kafka使用报错Subscription to topics, partitions and pattern are mutually exclusive
  20. Asp.Net Core 2.1 取消HTTPS配置

热门文章

  1. [文本纠错] pycorrector框架训练
  2. git代码库pull报错:error: Your local changes to the following files would be overwritten by merge
  3. minecraft1.16java_我的世界:1.16最神奇的种子,自然生成的石头雕像,基岩能用!...
  4. [动态规划] leetcode 416. 分割等和子集
  5. linux掩码,linux文件权限掩码umask
  6. React 编写项目连环套路
  7. CAD填充颜色透明颜色设置
  8. 使用第三方应用打开pdf文件
  9. 传感器采集数据 Python123
  10. Termux使用SSH