iOS开发BugFix记录 | 归档在虚拟机上可用,在真机上无效

虚拟机上可以,真机上无效的写法

    // 获取根目录
    NSString *homeDictionary = NSHomeDirectory();
    // 添加储存的文件名
    NSString *homePath = [homeDictionary stringByAppendingPathComponent:@"account.archiver"];
    // 归档
    BOOL isFinished = [NSKeyedArchiver archiveRootObject:userDict toFile:homePath]; // 真机上返回NO

修改后

    // 获取根目录
    NSString *homeDictionary = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0];
    // 添加储存的文件名
    NSString *homePath = [homeDictionary stringByAppendingPathComponent:@"account.archiver"];
    // 归档
    BOOL isFinished = [NSKeyedArchiver archiveRootObject:userDict toFile:homePath]; // 真机上返回YES

区别就是homeDictionary的获取

将它们分别打印出来可以:

  • NSHomeDirectory()
    /var/mobile/Containers/Data/Application/4EFFA455-3D2D-4D32-AB26-BABBA65372C9
  • [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]
    /var/mobile/Containers/Data/Application/4EFFA455-3D2D-4D32-AB26-BABBA65372C9/Documents
    可以看到后者多了一个“/Documents”

为什么第一种写法在虚拟机上可以,在真机上又无效?

模拟器用的是电脑操作,电脑操作比手机智能,路径写得相对模糊也可以找到文件。模拟器上只要在沙盒中给定了路径就可以,但是真机需要明确的路径。
参考:[http://stackoverflow.com/questions/963175/nskeyedarchiver-works-in-iphone-simulator-fails-on-device]

你可能感兴趣的:(iOS开发BugFix记录 | 归档在虚拟机上可用,在真机上无效)