macOS App 保存数据

2018-03-19  本文已影响133人  十月末的故事

1. 保存文本数据问题

Mac端的App,需要保存一些文本数据,尝试了几种方式,记录一下曲折。

  1. 保存到本 App 目录下,升级时可能会丢失数据。直接覆盖原App方式。无法测试升级方式,所以不是很确定。
  2. 保存到 Documents (文稿)目录下,可以保证升级问题,但是容易被用户删除或修改掉。
  3. 保存到 Application Support,必须要是完整的文件路径。

比如完整路径是 /Users/zzz/Library/Application Support 而不是 ~/Library/Application Support

最初是准备保存到 Application Support 文件夹中的,但刚开始取到的路径是 ~/Library/Application Support 这样的,结果就是无法创建文件夹,Console 提示 You don't have premission to save file in this folder 后来上网查询,几经曲折,才发现这个不是完整路径。

取得完整路径有以下方式,可能有更多,暂时只找到这三种。

  1. NSSearchPathForDirectoriesInDomains 最后一个参数,表示是否展开完整路径,传YES,得到的文件路径就是完整的。
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
  1. 用 stringByExpandingTildeInPath 方法来展开不完整路径,也可以得到完整路径。如果不确定得到的文件路径是否完整,可以用 stringByExpandingTildeInPath 这个方法再展开一次。
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, NO);
if (arr && arr.count > 0) {
    return [arr.firstObject stringByExpandingTildeInPath];
} 
  1. NSFileManager 取到的路径也是完整的
NSFileManager *fileMan = [NSFileManager defaultManager];
NSArray *urls = [fileMan URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask];  

2. 保存 NSImage 到文件

- (NSString *)saveImage:(NSImage *)image 
{    
    [image lockFocus];
    NSBitmapImageRep *bits = [[[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, size.width, size.height)] autorelease];    
    [image unlockFocus];
    
    NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:0.9] forKey:NSImageCompressionFactor];
    
    NSData *imageData = [bits representationUsingType:NSJPEGFileType properties:imageProps];
    [imageData writeToFile:appFile atomically:YES];
}
上一篇下一篇

猜你喜欢

热点阅读