沙盒和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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Mac应用程序中,如果想要在沙盒中写入文件,首先需要了解沙盒是什么。沙盒是一种安全机制,用于限制应用程序的访问权限,确保应用程序只能访问特定的文件文件夹。因此,在沙盒中写入文件需要遵循一些规则和限制。 首先,需要使用特定的API来进行文件写入操作,例如使用`NSFileManager`类中的方法`createFileAtPath:contents:attributes:`。在使用这些API时,需要提供要写入的文件路径文件内容,同时需要注意路径是相对于应用程序沙盒的。 其次,由于沙盒的限制,应用程序只有读取和写入自己的沙盒中的文件的权限,无法直接读取和写入其他应用程序或系统文件。这意味着,如果想要在沙盒中写入文件,需要明确文件路径,并且只能写入自己的沙盒文件夹中。 另外,由于沙盒限制了应用程序对系统的访问权限,某些特定位置的文件写入可能会受到限制。例如,写入`/Applications`文件夹下的文件是不被允许的。因此,需要在写入文件之前,先判断文件路径是否可写,并处理写入失败的情况。 最后,为了确保应用程序在用户重启电脑后仍然能够访问到写入的文件,可以将文件保存在应用程序的特定文件夹中,例如`~/Library/Application Support/YourAppName`。这样,文件将会一直保存在用户的沙盒中,即使应用程序被关闭和重启。 总而言之,要在Mac应用程序的沙盒中写入文件,需要使用特定的API进行操作,并遵循沙盒的限制和规则。这样可以保证应用程序能够安全、可靠地进行文件写入操作,并且在用户重启电脑后仍然能够访问到写入的文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值