iOS ipa包解析
阿新 • • 發佈:2019-02-19
最近有需求需要在打好包的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"}