1. 程式人生 > >iOS ipa包解析

iOS ipa包解析

最近有需求需要在打好包的ipa內新增配置檔案,由程式讀取配置到程式內,因此做了需求調研,最後找到一個方法,現在說明如下:

一、ipa壓縮包結構說明

這裡寫圖片描述

將ipa解壓得到包裡的內容如下:
1、_CodeSignature
檔案hash列表:存放每個檔案的hash值;
2、—–.xcent
授權檔案:存放App有哪些許可權被允許;
3、—-.mobileprovision
配置檔案:存放證書及其它一些相關專案;
4、其它-一些資原始檔

由於iOS在打包的過程中會對程式包內的每個檔案都做簽名,在程式包內的檔案是不允許被修改的,否則再次打包就會無法安裝;
在裡面可以存放“空資料夾”,這樣系統就會認為沒有變化,再次打包安裝是沒問題的;

//注意:
//這個裡面的其他位置是無法放置其它檔案的,但是在_CodeSignature資料夾內可以新增其它檔案,iOS系統是不會校驗這個資料夾內多餘的檔案的;
//這樣就可以在ipa打包之後,實現動態的在ipa包內新增工程的相關配置;

二、ipa包內檔案的訪問

iOS應用都被限制在“沙盒”中,“沙盒”相當於一個加了僅主人可見許可權的資料夾,蘋果對沙盒有以下幾條限制。
    (1)、應用程式可以在自己的沙盒裡運作,但是不能訪問任何其他應用程式的沙盒。
    (2)、應用程式間不能共享資料,沙盒裡的檔案不能被複制到其他應用程式資料夾中,也不能把其他應用程式資料夾中的檔案複製到沙盒裡。
    (3
)、蘋果禁止任何讀、寫沙盒以外的檔案,禁止應用程式將內容寫到沙盒以外的資料夾中。 (4)、沙盒根目錄裡有三個資料夾:Documents,一般應該把應用程式的資料檔案存到這個資料夾裡,用於儲存用 沙盒就是應用程式的安裝過程中、系統為每個單獨的應用程式生成它的主目錄和一些關鍵的子目錄 —資料夾 沙盒機制是一種安全體系,它規定了應用程式只能在本應用程式沙盒中讀取檔案,不可以訪問其他地方的內容。所有的非程式碼檔案都儲存在這個地方,比如圖片、音訊、視訊、屬性列表(偏好設定)和文字檔案等。 優點 安全 每個應用程式都在自己的沙盒內 不能隨意跨越自己的沙盒區訪問別的應用程式沙盒的內容,應用程式向外請求或接受資料都需要經過許可權認證 缺點 檔案訪問受限 訪問檔案不靈活 獲取這些目錄路徑的方法: 1
,獲取home目錄路徑的函式: NSString *homeDir = NSHomeDirectory(); 2,獲取Documents目錄路徑的方法: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDir = [paths objectAtIndex:0]; 3,獲取Caches目錄路徑的方法: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesDir = [paths objectAtIndex:0]; 4,獲取tmp目錄路徑的方法: NSString *tmpDir = NSTemporaryDirectory(); 5,獲取應用程式程式包中資原始檔路徑的方法: 例如獲取程式包中一個圖片資源(apple.png)路徑的方法: NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 程式碼中的mainBundle類方法用於返回一個代表應用程式包的物件。

三、_CodeSignature檔案的讀取

1、路徑檔案讀取

 //資源包路徑    
  NSString *bunPath = [[NSBundle mainBundle]bundlePath];
   //獲取資源包下所有檔案的子路徑
    NSArray *pathArray = [[NSFileManager defaultManager]subpathsAtPath:bunPath];
    //拼接CodeResources路徑
    NSString *codePath = [bunPath stringByAppendingPathComponent:@"_CodeSignature/CodeResources"];
    //資料讀取
    NSData *data = [NSData dataWithContentsOfFile:codePath];

2、雖然可以解壓ipa,在裡面放置檔案,但是不能通過程式往裡面寫入資料,這是不被允許的;

Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x17407bf00 {NSFilePath=/private/var/mobile/Containers/Bundle/Application/C30F8A79-A9B0-4907-A528-070110717701/f.app/_CodeSignature, NSUnderlyingError=0x17405dd90 "The operation couldn’t be completed. Operation not permitted"}