iOS 9读取文件权限

9

在iOS 9及以上版本中,尝试从文件读取时会得到一个空值。在这种情况下,文件是一个图像文件路径。
使用:

NSData(contentsOfFile: stringpath, options: NSDataReadingOptions.DataReadingUncached)

或者

NSData(contentsOfFile: stringpath)

操作:
我已经从路径中删除了“file://”,但它现在存在权限问题。

错误域=NSCocoaErrorDomain Code=257,“文件“IMG_0048.JPG”无法打开,因为您没有查看它的权限。” UserInfo={NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0048.JPG, NSUnderlyingError=0x13f978f50 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

我已添加NSAllowArbitraryLoads并将其设置为true。
我尝试使用“NSSearchPathDirectory”查找文件,但路径完全不匹配。


你是怎么获取这些路径的?看起来像是在访问相机/相册中的图片。 - Inder Kumar Rathore
1
路径错误。首先以字符串格式获取您的路径。然后通过使用文件路径找到URL。然后在给定的URL中查找内容。 - Gagan_iOS
使用 https://github.com/mikaoj/BSImagePicker,PHAsset 有一个名为“PHImageFileURLKey”的值,它是图像的路径。 - Lawgrin Foul
你解决了这个问题吗?如果是,请帮忙。 - Ankit Kumar Gupta
4个回答

4
我遇到了这个错误,因为我试图在同一个块中访问多个文件。对我有效的修复方法是改变代码结构,使得每个文件的url在尝试获取下一个文件的url之前被获取并读取。

你知道这是为什么吗?另外,如何获取每个URL?是从AVAsset中获取的吗? - Shade
2
我曾经遇到过类似的问题。我通过PHImageManager.defaultManager().requestAVAssetForVideo()获取了一个文件系统URL。如果我尝试从NSFileManager使用该URL超过一次,第二次就会出错。在我的情况下,我有一个解决方法:我复制了该文件,然后对其进行了一些其他操作。如果我访问我的新副本(而不是原始副本)进行第二个NSFileManager操作,它就可以工作了。可能是安全问题。奇怪... - Anna Dickinson

1

你很可能会遇到这个错误,因为iOS应用程序只能访问其沙盒内的文件。请参阅苹果公司有关文件系统的文档获取详细信息。


0
在您的应用程序中,由于沙盒机制,您无权访问文件 /var/mobile/Media/DCIM/100APPLE/IMG_0048.JPG
因此,无论您做什么,都不能使用文件路径初始化NSDataUIImage。但是,您可以使用AVURLAsset访问/var/mobile/Media/DCIM/100APPLE/xxx.mov文件。在我的应用程序中,我通过照片套件从图库中提取了数据,并使用该数据初始化了UIImage
PHImageManager.default().requestImageData(
    for: assetObject!, options: options,
    resultHandler: {
        data, _, _, _ in
        if data != nil {
            self.assetUrl = movieMaker.createMovieFrom(imageData: data!, duration: Int(CXPreparetValue.imageDuration))
        }
})

这对我有效!如果您有其他意见,请告诉我。


-2
在我的情况下,文件权限过于严格,因此我无法读取该文件。
在访问之前将文件添加读写权限解决了这个问题。
do {
    // Retrieve any existing attributes
    var attrs = try FileManager.default.attributesOfItem(atPath: stringpath)
    let existing = (attrs as NSDictionary).filePosixPermissions()
    // Set the read+write value in the attributes dict
    attrs[.posixPermissions] = existing | 0b110000000
    // Update attributes
    try FileManager.default.setAttributes(attrs, ofItemAtPath: stringpath)

    // Read data from file
    let data = try Data(contentsOf: URL(fileURLWithPath: stringpath, isDirectory: false), options: .uncached)
    print("success: \(data.count)")
} catch {
    print(error)
}

如果您在具有足够权限的文件夹中,那么这将起作用,因为即使您以前没有读取文件的权限,您也可以更改文件的权限。此解决方案已应用于https://github.com/ZipArchive/ZipArchive/issues/293


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接