如何在iOS上的更新之间保留缓存中的大文件?

时间:2014-04-19 02:49:40

标签: ios download policy persist

我有一个应用程序,其中包含下载的大文件中的离线地图。它最初被拒绝,因为它将地图存储在文档中。据此,地图需要存储在缓存中。

https://developer.apple.com/icloud/documentation/data-storage/

问题是,每次更新应用程序时,都会删除所有地图。这真的让人很生气,导致他们停止使用应用程序并给予不好的评价。

就其本质而言,此应用程序适用于希望依赖可用的离线地图以及可能没有快速互联网连接或廉价数据计划的旅行者,以便在每次更新时重新加载数百兆字节的数据。

是否可以将地图存储在文档中并将其标记为从备份中排除?这里描述了它?

https://developer.apple.com/library/ios/qa/qa1719/_index.html

还有另一种方法可以在更新之间保留地图吗?

2 个答案:

答案 0 :(得分:1)

您应该将/ Library / Caches目录用于此类长期存储。获取此值的代码:

NSString *directory = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
directory = [directory stringByAppendingString:@"/Caches"];

我非常确定此目录的内容将通过应用更新保留。但是,如果用户删除了应用程序,则数据将被删除。

答案 1 :(得分:1)

这对我有用。基本上将地图放在应用程序支持中并标记它们不被备份。

- (NSURL *) getApplicationSupportUrl {
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *urls = [fm URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask];
    NSURL *url = [urls objectAtIndex:0];
    url = [url URLByAppendingPathComponent:[[NSBundle mainBundle] bundleIdentifier] isDirectory:YES];
    return url;
}

- (NSURL *) getMapDirectory:(int)cityid {
    NSURL *url = [self getApplicationSupportUrl];
    url = [url URLByAppendingPathComponent:[NSString stringWithFormat:@"map%d",cityid] isDirectory:YES];
    return url;
}

- (BOOL) excludeDirectoryFromBackup:(NSURL *)url {
    NSError *error = nil;
    BOOL success = [url setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    return success;
}


// in the app
NSRUL *mapurl = [self getMapDirectory:123];
// download maps tiles to mapurl
[self excludeDirectoryFromBackup:mapurl];