布景
所开发的 App 包巨细达到了 230M+,下载缓慢,并且运用数据下载较费事。
为什么要优化包巨细?
首先是 Apple Store 数据下载的约束;
另外无非便是包大了,用户不愿意下载了,空间不足的时分要删去 App 第一个想到的便是删去大的 App。
怎么优化?
1. 删去无用类、无用图片
由于项目经过两次重构、多次 UI 替换,导致许多无用类和无用图片未铲除。
-
删去无用图片资源,能够运用 LSUnusedResources
需求留意的是:东西可能会误判,一定要经过二次承认再去删去,防止铲除后影响正常业务。
2. 重复代码抽离
举例:音讯 encode、decode 重构
原先音讯基类 messageContent 的公有特点,都需求在子类中 encode 和 decode 处理一遍,书写费事,并且代码冗余。
encode 和 decode 进行重构优化,子类只需求在 encode 的时分调用 super,然后将子类特有的值塞到 dict 中回来即可,在 decode 的时分从 dict 中取出特有的值运用即可。
优化结果
App 层 + SDK 层总计近 100 种音讯,每个基于 MessageContent 的子类重复代码削减约 40 行,每个基于 MediaMessageContent 的子类重复代码再削减 11 行,大约削减 4000+ 行冗余代码,极大程度地削减新建音讯子类的代码以及时间。
修正前子类代码:
///将音讯内容编码成json
- (NSData *)encode {
NSMutableDictionary *dataDict = [NSMutableDictionary dictionary];
[dataDict setObject:self.content forKey:@"content"];
if (self.extra) {
[dataDict setObject:self.extra forKey:@"extra"];
}
if (self.senderUserInfo) {
[dataDict setObject:[self encodeUserInfo:self.senderUserInfo] forKey:@"user"];
}
if (self.mentionedInfo) {
[dataDict setObject:[self encodeMentionedInfo:self.mentionedInfo] forKey:@"mentionedInfo"];
}
NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:kNilOptions error:**nil**];
return data;
}
///将json解码生成音讯内容
- (void)decodeWithData:(NSData *)data {
if (data) {
__autoreleasing NSError *error = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (dictionary) {
self.content = dictionary[@"content"];
self.extra = dictionary[@"extra"];
NSDictionary *userinfoDic = dictionary[@"user"];
[self decodeUserInfo:userinfoDic];
NSDictionary *mentionedInfoDic = dictionary[@"mentionedInfo"];
[self decodeMentionedInfo:mentionedInfoDic];
}
}
}
修正后子类代码:
- (NSMutableDictionary *)encodeDict {
NSMutableDictionary *dataDict = [super encodeDict];
[dataDict setObject:self.content forKey:@"content"];
return dataDict;
}
- (NSDictionary *)decodeWithData:(NSData *)data {
NSDictionary *dictionary = [super decodeWithData:data];
self.content = dictionary[@"content"];
return dictionary;
}
3. 图片资源紧缩
图片资源运用 WebP,紧缩率高,并且肉眼看不出差异,一起支撑有损和无损两种紧缩模式。紧缩后巨细别离减小 64%、19%。
图片巨细超过 100KB,考虑运用 WebP,小于 100KB 时,能够对图片进行无损紧缩。
需求留意的是:尽管 WebP 的图片格式更小,但是系统 API 只支撑 iOS14 以上运用,低版本还需求用 sd/其他方法 解析,否则会导致显现不出来。
4. 删去合并动态库
删去合并无用的动态库
位置音讯合并至主库,删去公众号、客服、客服、讨论组、翻译、位置等动态库。
5. Xcode 编译设置优化
此模块处理参阅 百度APP iOS端包体积50M优化实践(一)总览