1. 程式人生 > >iOS-APP包的瘦身之旅(從116M到現在的36M的減肥之路)

iOS-APP包的瘦身之旅(從116M到現在的36M的減肥之路)

前言

    我還在上一個東家的時候,我現在東家的專案寫了幾個功能作為外包給我做了,所以沒來這家公司的時候我對這個專案就比較熟悉了;前年從上家公司離職後受邀來到現在這家公司了。接手這個APP因為急著上線功能,所以我也沒有對APP進行優化,先前是三個程式設計師開發的,上線以後APP包達到116M,每次運營出去推廣下載是個痛苦的事,非常的慢,所以每次運營的小夥伴出去推廣,都會帶上地推盒子,我每次都會把最新的ipa放到地推盒子裡,給運營小夥伴用......說多了都是淚哭。所以下決心擠時間來優化安裝包。

    安裝包的優化是個細緻漫長的過程,我這裡會把我做的事一一描述出來,以供大家參考。

1.大檔案移除

    我們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開啟或關閉某個功能)》。

2.圖示管理優化

    開始專案中的圖示檔案是被小夥伴們直接放在工程目錄下面的,裡面有1x、2x和3x的圖片,當然打包的時候這些檔案也都被打包進去了。我這裡做的就比較簡單了我把圖片放在Xcode自帶的圖片管理工具裡面Images.scasssets,這樣的好處就是打包的資源包中的圖片會被放到Assets.car.圖片有被壓縮;此時若用[[NSBundle MainBundle] pathForResource:  ofType: ]來訪問時訪問不到的。同時你也無法像平常一樣輕易的拿到被人的圖片資源了,不用再為多畫素的圖片命名。mages.xcassets會自動的排列不同畫素的圖片。

    還有就是一些常用的小圖示,可能樣式是一樣的,但是就是顏色不一樣,這樣在工程中也很多;我這裡用到iconfont來替換png圖示,用起來還簡單,不但減小了資原始檔的佔用空間還方便使用。

    最後就是刪除工程中不用的icon圖示了。

3.相同功能控制元件的封裝

    我們在開發中肯定會遇到相同控制元件或者功能,也有可能就是不同的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中所以的帖子型別的列表。

4.第三方庫的精簡

    第三方庫的使用是專案中不可避免的,我們在開發過程中為了節約開發的時間成本和財力成本,我們經常會使用一些第三方庫。我們APP在專案中用到IM即時聊天,我們選用的是融雲的IM聊天庫,融雲IM註釋詳細接入方便,融雲IM有IMKit和IMLib兩種庫,如果你使用融雲IM的UI那你就要把這兩張庫都匯入,但是這兩種庫都匯入的話佔用不少容量,光磁碟大小就有44M了,但是我們APP的聊天場景比較簡單,就是單聊和群聊,所以這裡面我刪除了IMKit庫,在IMLib的基礎上自己寫聊天UI,這樣又精簡了不少記憶體。如下圖:


    總結:我們在使用第三方庫的時候可以根據自己的需求選擇性的使用。

5.基類的使用

    基類是每個初學者都應該知道的,當然在開發過程中也是非常實用的,我們把一些常用的或者同樣的方法放在基類裡面,這樣繼承基類的類也都能使用。舉例:友盟統計方法我寫在BaseViewController裡面,程式碼如下:

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

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

6.程式碼精簡

    程式碼精簡是開發者的思維習慣和開發習慣所決定的,還有就是你的開發年限。比如我現在有一個數組讓你來去重,這就要很多種方法了,但是不同的方法所產生的程式碼就不一樣了,但是結果是一樣的,比如:

方法一:

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]];
        }
        
    }

方法二:

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

    很明顯方法二的程式碼少於方法一,但是達到的效果也是一樣的。

    還有就是刪除無用的程式碼,APP在開發過程中,因為版本的迭代,時間久了會產生很多無用的類或者程式碼,這樣我會選擇刪除,如果害怕以後會用得到,你可以選擇先備份一份,當然在備份的時候要弄一份備份文件是最好不過的了。

結束語

    歡迎各位大神補充!

    歡迎大家加移動開發技術交流群,在這裡大家可以一起討論學習,這裡有大佬,也有小菜鳥,沒事還能鬥鬥圖裝裝逼,如果需要換工作的還能相互推薦,期待大家的加入!偷笑