2012-10-01 56 views
10

我將一些運行時生成的文件保存在iOS應用的.app包中。在模擬器它工作正常,在設備崩潰:iOS應用程序在其包中有寫入權限嗎?

能在給定的着色器緩存路徑 「在/ var /移動/應用/ CB064997-B40E-4FE3-9834-B3217CE33489/SimedTest創建輸出文件。應用程序/ Ogre3D /資產/ RTShaderLib /緩存/

有很好的概述我應該在哪裏,不應該放置文件 - 如何使用Documents,Library和tmp等?

爲了澄清,這些是在啓動時創建的文件,它會預先計算一些數據以節省時間。如果它們不存在,它們會被創建,所以它們可以被刪除,但不會在應用程序運行時被刪除。

+1

有關存儲文件的位置以及防止iCloud備份的詳細信息,請參閱http://stackoverflow.com/a/12371323/1633251。 –

回答

14

束是隻讀的。你不想亂它,原因有兩個:

  • 代碼簽名:該簽名通過對該包的內容進行驗證;如果你亂捆綁,你會破壞簽名。
  • 應用程序更新:更新的工作方式是用新下載的應用程序包替換整個應用程序包;您所做的任何更改都將丟失。

您應該在哪裏保存的東西:

  • 文件:如果你想讓它堅持和備份
  • 庫/緩存:如果你只是想緩存下載數據,如個人資料照片;如果空間不足,系統將自動刪除,除非您使用特殊的不刪除標誌進行指定。
  • TMP:臨時文件,當您的應用程序沒有運行

更全面的解釋刪除檢查File System Programming GuideQA1719

+0

tmp的行爲...什麼時候清除? –

+0

@John更新了鏈接;您應該自行清除tmp,但系統保留在您的應用程序未運行時刪除任何內容的權利。 – benzado

4

不,每次更改包時,都會使簽名無效。

如果你想寫文件,你需要寫在最好的文件夾中,這取決於你想要用這個文件做什麼。持續時間長

  1. Documents文件夾文件
  2. 緩存爲小型操作

編輯

要獲得path您`ll需要是這樣的:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"filename.ext"]; 

有了這個path你可以編寫或閱讀這樣的:

寫:

NSString *content = @"One\nTwo\nThree\nFour\nFive"; 
[content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil]; 

讀:

NSString *content = [[NSString alloc] initWithContentsOfFile:fileName usedEncoding:nil error:nil]; 
相關問題