iOS10文件系统 - 不再是app容器中的文件?

时间:2016-11-17 21:01:32

标签: ios iphone xcode ios10

出于调试目的,我经常使用诸如此类的代码将数据写入iOS上的文件......

NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [docsPath stringByAppendingPathComponent:testName];
FILE* resultsFile = fopen([filePath UTF8String],"w");

...然后通过Xcode下载容器获取数据(通过选择" Window-> Devices"屏幕上的应用程序,然后选择"下载容器...& #34;来自应用列表正下方的"小齿轮"弹出式菜单。)

我记得这适用于iOS 9和之前的版本,但是在iPhone 6上的iOS 10上尝试这个,我发现它不再起作用了。对fopen的调用正在为/var/mobile/Containers/Data/Application/[uuid]/Documents/testname返回成功,但下载时文件不在容器中。

该文件不在容器中吗?在其他地方吗?或者是否根本无法将数据转储到文件中并将其从手机中取出?

1 个答案:

答案 0 :(得分:0)

我尝试重现您的问题(在iOS 10.3.3,Xcode 10.1下),并且在App项目的上下文中,所有这些都对我有效。您遇到的问题可能与您对文件对象resultFile所做的事情有关,如果您可以共享一些包含下一行代码的代码(或检查例如您正在调用fclose()),则可能更容易解决。

还请注意,似乎不支持从控制App Extension的代码写入Docs目录,如以下详细所述:reading and writing to an iOS application document folder from extension

在App项目/目标的上下文中起作用的代码:

  • 像这样在Swift中使用数据:

    guard let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last else { return }
    
    let someData = "Hello world using swift".data(using: .utf8)
    
    do{
       try someData?.write(to: documentsPath.appendingPathComponent("hello-world.txt"))
    }catch{
        //handle the write error
    }
    
  • 在目标C中使用NSData:

    NSString * hello = @"Hello world using NSData";
    NSData * helloData = [hello dataUsingEncoding: NSUTF8StringEncoding];
    
    NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [docsPath stringByAppendingPathComponent:@"fileNameObjcNSData.txt"];
    [helloData writeToFile:filePath atomically:true];
    
  • 使用fopen:

    NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [docsPath stringByAppendingPathComponent:@"fileNameObjcFopen.txt"]; //
    FILE * fileHandle = fopen([filePath UTF8String], "w");
    
    if (fileHandle != NULL){
        fputs("Hello using fopen()", fileHandle);
        fclose(fileHandle);
    }
    

希望有帮助