2016-05-31 156 views
1

我试图从新的Firebase存储将图像下载到本地文件。为此,我使用Firebase提供的示例here。这是我的代码:未从Firebase存储下载的图像

func getTumbnails(imageName: String) { 
    // Create a reference to the file you want to download 
    let tumbnailRef = storageRef.child("tumbs/\(imageName)") 
    // Create local filesystem URL 
    let localURL: NSURL! = NSURL(string: "file:///local/tumbnails/\(imageName)") 

    // Download to the local filesystem 
    let downloadTask = tumbnailRef.writeToFile(localURL) { (URL, error) -> Void in 
     if (error != nil) { 
      print(error) 
     } else { 
      let data = NSData(contentsOfURL: URL!) 
      self.data = data! 
      print(data) 
     } 
    } 
} 

但是当我调用该函数getTumbnails("image")我收到以下错误打印到控制台:发生

可选(错误域= FIRStorageErrorDomain代码= -13000“未知错误, “UserInfo = {object = tumbs/Sunset.png,bucket = ********。appspot.com,NSLocalizedDescription =发生未知错误,请检查服务器响应。,ResponseErrorDomain = NSCocoaErrorDomain ,NSFilePath =/local/tumbnails,NSUnderlyingError = 0x137f629c0 {Error Domain = NSPOSIXErrorDomain Code = 1“Operation not permitted”},ResponseErrorCode = 513})

我发现this问题在这里stackoverflow,但这是一个不同的错误(响应代码518,而我有513),因为我直接使用示例代码,这应该只是工作。

有人可以帮我吗?

回答

3

这里的问题是,你得到一个NSPOSIXErrorDomain错误,表明您没有权限写入文件file:///local/tumbnails/\(imageName),可能是因为该目录(/local)不存在,即使它存在,您没有权限写信给它。

我想看一下the docs的目录列表,你可以写入 - 你应该使用/Documents/tmp

+0

谢谢!但是,这适用于模拟器,但不适用于实际设备。 –

+0

模拟器上的应用程序沙盒可能与设备上的运行方式不同 - 您在设备上遇到了哪些问题?这也可能是你在设备上拥有不同的权限,并且不能写入'/ Documents'(你可能需要写入你的用户目录或只是写入/ tmp) –

+1

我已经试图写入'/ tmp'没有成功:( –

0

好像你可能没有正确申报您的storageRef(即你的水桶被称为bucket=yourbucket.appspot.com),或者可能是您添加Firebase/Storageworkspace但没有更新Google-info.plist。也许你可以展示更多你的代码?

更新: 你可以尝试

let localURL: NSURL! = NSURL.fileURLWithPath(string: "file:///local/tumbnails/\(imageName)") 
+0

谢谢,但我已经正确设置了一切。出于安全原因,我将其更改为'yourbucket.appspot.com',因为我还没有任何规则。 –

+0

也许你可以试试'让localURL:NSURL! = NSURL.fileURLWithPath(字符串:“文件:///本地/ tumbnails/\(imageName)”) – Chris

+2

这不是一个Firebase存储问题,错误(令人困惑)是一个'NSPOSIXErrorDomain',这意味着问题来自文件系统不会让开发人员写入该位置。 –

0

也许它的iOS 9的应用程序传输安全,此代码添加到您的info.plist并再次检查

<key>NSAppTransportSecurity</key> 
    <dict> 
     <!--Include to allow all connections (DANGER)--> 
     <key>NSAllowsArbitraryLoads</key> 
      <true/> 
    </dict> 
+1

不,不需要ATS,因为Firebase存储使用适当的SSL密码。 –