沙盒和App Group
Posted 亚布./
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了沙盒和App Group相关的知识,希望对你有一定的参考价值。
1.沙盒机制
沙盒也叫沙箱,英文standbox,其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中。在沙盒机制下,每个程序之间的文件夹不能互相访问。ios系统为了保证系统安全,采用了这种机制
iOS 应用程序在安装时,会创建属于自己的沙盒文件,应用程序不能直接访问其他应用程序的沙盒文件,当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。
应用程序中所有的非代码文件都保存在沙盒中,比如图片、声音、属性列表,sqlite数据库和文本文件等。
2.获取沙盒路径
NSLog(@"%@",NSHomeDirectory());
3.沙盒的根目录有三个文件夹,分别是Documents,Library,tmp
代码路径:
FOUNDATION_EXPORT NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
NSSearchPathForDirectoriesInDomains 是用来查找文件路径的函数,其返回值是一个数组,这个数组中只有一个NSString类型元素,这个元素保存的就是查找的路径。
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"韩宝仪.jpg"];
UIImage *image = [UIImage imageNamed:@"Mojave"];
NSData *imgData = UIImageJPEGRepresentation(image, 0.5);
[imgData writeToFile:path atomically:YES];
参数1: NSDocumentDirectory 表示需要查找的是Document文件夹
参数2:NSUserDomainMask 表示在用户的主目录中查找
参数3:YES 表示返回路径展开
图片就保存到沙盒Document里面了。
4.stringByAppendingPathComponent 和 stringByAppendingPathExtension 区别?
——> stringByAppendingPathComponent:拼接的是路径,加“/”,使之变成一个完整的路径。
NSMutableString *str = @“tmp”;
str = [str stringByAppendingPathComponent:@"hello.png"];
//str就变成 tmp/hello.png了
——> stringByAppendingPathExtension:是加后缀的意思。
NSMutableString *str = @“tmp”;
str = [str stringByAppendingPathExtension:@"png"];
//str就变成 tmp.png了
5.App Group
- 实际开发中,我们也许会有这种需求:公司有两个APP,当用户登录其中一个APP后,在下载第二个APP的时候,可以实现自动登录的功能。
- 这种情况如何实现呢?我之前的项目一直都是用第三方类库
KeychainAccess
实现的钥匙串分享数据的模式Keychain share
。但是几天前查资料,开始认识另外一种方式,不依赖第三方库就可以实现,那就是APP Groups。iOS8
新开放的功能
写入数据:
//第一个 App 共享文件appGroup.txt中写入数据
//获取App Group的共享目录
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.XXXX.XXXX"]; //根据公司项目自己定义
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"tmp.txt"];
//写入文件
[@"hello-word" writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
读取数据:
//第二个 App 通过获取tmp.txt中的数据
//获取App Group的共享目录
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.XXX.XXX"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"tmp.txt"];
//读取文件
NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
通过App Group存储的数据和我们普通沙盒存储数据是不在一个文件夹下的。通过两个路径对比一下:
/Users/xxx/Library/Developer/CoreSimulator/Devices/DA2FC821-3201-4666-B2F8-5B5C64232997/data/Containers/Shared/AppGroup/51C2FBEB-AFD4-4C11-8F39-A853FB05FE07/
/Users/xxx/Library/Developer/CoreSimulator/Devices/DA2FC821-3201-4666-B2F8-5B5C64232997/data/Containers/Data/Application/4EE197CF-2D91-49C5-8EEC-7841106D584B/Documents/
以上是关于沙盒和App Group的主要内容,如果未能解决你的问题,请参考以下文章