iOS 关于每次重新运行app,保存文件的沙盒路径就失效的问题

1.发现问题

简单举个例子,保存一个UIImage进沙盒/Documents目录下

UIImage * wtImg = ...;
NSString *path_header = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSData *imgData=UIImagePNGRepresentation(wtImg);
NSString *path_wtImg = [path_header stringByAppendingString:@"/wtImg.png"];
[imgData writeToFile:path_wtImg atomically:YES];

然后顺手把这个图片的完整路径path_wtImg给保存起来了,方便其他地方读取使用.
DuangDuangDuang~~~~
问题就出现了,本次app不杀死没啥事,图片顺利读取,可一旦app进程杀死了,再读取就读取不到了.

2.查明原因

根据地址去寻址找东西,东西不见了,那必然是地址和东西没对应上,先去找下地址对应文件是不是还在.果然.按照原完整路径去寻址,文件夹不存在,有问题看log,通过打印发现两次运行app的沙盒路径不一致,不一致的地方在Application文件夹下

/Application/22F01795-4B87-4592-B5EF-E084BEC8256B/Documents/
/Application/A529F060-40BD-4A0B-9E59-04A83321BEF7/Documents/

那就是系统的问题咯,翻看文档发现在iOS8前,路径不会变,从iOS8,Xcode6之后, 每次运行后沙盒的路径都会变化,生成新的一个路径,原路径文件夹内容被替换至新路径下,原文件夹对应就找不到了,应该是为了安全每次运行都给/Application下文件夹重名

3.解决问题

知道这个就好办了,保存文件时值存文件名好了,至于读取时候完整地址重新拼接

NSString *path_header = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path_wtImg = [path_header stringByAppendingString:@"/wtImg.png"];
UIImage * partImg = [UIImage imageWithContentsOfFile:path_wtImg];

搞定. 欢迎大家指正

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值