我正在制作一个应用程序,使用编码存储对象在文档目录,
在iOS模拟器上,对象被完美地保存,如果我关闭应用程序并回到它所有的数据都恢复了没有问题。
但是今天我在iPhone 5s上尝试了我的应用程序,当我关闭应用程序并再次返回它时,对象没有被保存,所有的数据都只在真正的设备上被删除,问题是什么?
我使用这个方法来获取目录路径:
- (NSString *)pathForTask
{
NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [documentDirectories firstObject];
return [documentDirectory stringByAppendingString:@"Tasks"];
}
存档:
NSString *path = [self pathForTask];
[NSKeyedArchiver archiveRootObject:self.privateTasks toFile:path];
Unarchive:
NSString *path = [self pathForTask];
_privateTasks = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
下面这行代码导致了你的问题:
return [documentDirectory stringByAppendingString:@"Tasks"];
返回路径的结果类似于:
.../DocumentsTasks
注意没有斜杠。
将行改为:
return [documentDirectory stringByAppendingPathComponent:@"Tasks"];
这将返回一个正确的路径,并且您的代码将在设备上工作。
它在模拟器中工作,因为您最终在计算机上的某个文件夹中创建了一个名为DocumentTasks
的文件。但是在实际设备上,由于沙箱,这个文件试图写入的文件夹是只读的。
尝试使用以下代码获取文档目录:
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
获得documents目录后,您可以执行以下命令获得特定文件的路径:
NSURL *fileURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"[FILE NAME]"];
我不知道为什么你的代码不工作,但这是我在我的应用程序上使用的代码,它在模拟器和物理设备中工作。
通常在sim卡上工作但在设备上不起作用的代码是由文件名大小写不匹配引起的。
Mac OS中的文件系统几乎总是不区分大小写的。(您可以使用Mac OS中文件系统区分大小写的磁盘卷,但它们不是默认的。)
模拟器运行在Mac OS上。它的文件系统不区分大小写。所以,如果你将文件保存为"任务",然后将其加载为"任务",它将在模拟手机上运行,但在实际的iOS设备上却无法运行。请务必仔细检查文件名中是否存在不匹配的大小写