iOS目錄的三言兩語

發文章先幹一下,媽的蘋果又退我們件,又是該死的iap問題

Audio story is set to consumable.

這什麼鳥理由,怕我們跟apple 線上音樂衝突到嗎,查了一下StackOverFlow也是有一堆人因為這問題被退。

好吧,先不管iap的事情,這次還有一個退件原因是因為我把暫存圖存到了Document資料夾下

因為在iOS SandBox下 只有tmp和library/cache下不會被iTunes和iCloud備份。

你硬要存到Document的話,要寫一段Code去特別聲明這個資料夾是不備份的。

但你要存一些東西又要暫存資料呢,只好另尋方法。

網路最常用的就是存到library/cache中,這樣你存得資料就不會被備份到。

你要查看你存的東西會不會被備份可以用此方法

  • Install and launch your app
  • Go to Settings > iCloud > Storage & Backup > Manage Storage
  • If necessary, tap “Show all apps”
  • Check your app’s storage

因為我用的圖片暫存是我自己寫的,不是用網路上找的,例如SDWebImage這個有名的第三方Library。

所以著手來改一下自己的程式碼吧。

原本找到Document資料夾下的語法應該是這樣

Document directory
1
2
3
4
//找到Document目錄
NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
//儲存到Document目錄下
NSString *storePath = [applicationDocumentsDir stringByAppendingPathComponent:你的String];

現在要改成如下

找到cache Dir 創建自定目錄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//找到根目錄下的cache目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
//再找到cache目錄下的ImageCache資料夾
//因為我想把照片都存到一個目錄去管理,而不是都丟到cache下
NSString *cacheDirectory = [paths[0] stringByAppendingPathComponent:@"ImageCache"];
//設一布林值去做判斷
BOOL isDir = NO;
NSError *error;
//如果cacheDirectory目錄不存在,則先建立一個cacheDirectory
//也就是上面寫的ImageCache目錄
if (! [[NSFileManager defaultManager] fileExistsAtPath:cacheDirectory isDirectory:&isDir] && isDir == NO) {
[[NSFileManager defaultManager] createDirectoryAtPath:cacheDirectory withIntermediateDirectories:NO attributes:nil error:&error];
}
//寫入cacheDirectory中
NSString *storePath = [cacheDirectory stringByAppendingPathComponent:你的String];

上面你的String中,你可先做UTF8編碼或是base64做處理,隨自己高興

這樣就完成了把照片存到/library/cache中的ImageCache中

有些友善的APP還會提供刪除暫存的工作,可以用如下Method

刪除自定cache中資料夾檔案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+(void)RemoveCacheFiles
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cacheDirectory = [paths[0] stringByAppendingPathComponent:@"ImageCache"];
NSFileManager *fileMgr = [[[NSFileManager alloc] init] autorelease];
NSError *error = nil;
NSArray *directoryContents = [fileMgr contentsOfDirectoryAtPath:cacheDirectory error:&error];
if (error == nil) {
for (NSString *path in directoryContents) {
NSString *fullPath = [cacheDirectory stringByAppendingPathComponent:path];
BOOL removeSuccess = [fileMgr removeItemAtPath:fullPath error:&error];
if (!removeSuccess) {
// Error handling
}
}
} else {
// Error handling
}
}

這樣就完成了改寫自己程式碼的東西了,暫存的資料既不會被iTunes備份也不會上傳到iCloud更不會因為這原因被APPLE退件了。