出于调试目的,我经常使用诸如此类的代码将数据写入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
返回成功,但下载时文件不在容器中。
该文件不在容器中吗?在其他地方吗?或者是否根本无法将数据转储到文件中并将其从手机中取出?
答案 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);
}
希望有帮助