也许我只是错过了文档中的某些内容,但我找不到任何说明这种行为应该在 iOS 8 中进行更改的内容。
我的应用程序将当前工作目录设置为
Documents
目录,然后尝试使用 NSFileManager -createFileAtPath
在那里创建文件。在 iOS 8 之前,这可以正常工作。在运行 iOS 8 的设备上,我在致电 -createFileAtPath:
时收到以下信息
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSFileManager fileSystemRepresentationWithPath:]: nil or empty path argument'
这是重现问题的最小代码片段:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [paths objectAtIndex:0];
[[NSFileManager defaultManager] changeCurrentDirectoryPath:docsDir];
[[NSFileManager defaultManager] createFileAtPath:@"temp.dat" contents:nil attributes:nil];
注意
createFileAtPath
上的路径参数是 "temp.dat"
- 如果我将其更改为 "./temp.dat"
,则调用成功。
我是否做了一些愚蠢的事情,而这只是在之前的 iOS 版本中“意外”工作?或者他们故意改变这里的行为?或者这是 iOS 8 中的一个错误?其他采用
path
参数的 NSFileManager 方法似乎只需要文件名即可(例如 -removeItemAtPath:@"temp.dat" error:&err
成功)。
编辑添加:
这只发生在物理设备上。在模拟器中,上面对
createFileAtPath
的调用成功了。
我向 Apple 提出了一个错误,他们将其作为重复项关闭。虽然这并不一定证实他们认为这是一个错误,但它至少证实我不是第一个遇到这种情况的人,而且这种行为确实随着 iOS 8 发生了变化。
目前,解决方案是在文件名前面添加
./
,或提供绝对路径。
我昨天遇到了这个问题,我在这上面花了很多小时,也许是 4 个小时。分析问题,发现没有问题。
因此,我更改了资产并且构建按预期进行。我认为旧资产由于某些隐含的原因而存在问题 - 我正在尝试将资产转换为 base64 格式。
仅供参考:我正在使用 XCode 为我的 Flutter 应用程序插件进行 Swift 开发。