ios - Firebase downloadURLWithCompletion 错误

标签 ios swift firebase firebase-storage

我正在尝试从我的 Firebase 存储中下载视频。我这样做的方法是使用 .downloadURLWithCompletion 函数。当函数执行时,我收到此错误

Error Domain=FIRStorageErrorDomain Code=-13010 "Object videos/video1.m4v
    
 does not exist." UserInfo={object=videos/video1.m4v
    
, bucket=**********.appspot.com, ResponseBody={
  "error": {
    "code": 404,
    "message": "Not Found"
  }
}, data=<7b0a2020 22657272 6f72223a 207b0a20 20202022 636f6465 223a2034 30342c0a 20202020 226d6573 73616765 223a2022 4e6f7420 466f756e 64220a20 207d0a7d>, NSLocalizedDescription=Object videos/video1.m4v
    
 does not exist., ResponseErrorDomain=com.google.HTTPStatus, ResponseErrorCode=404}

我已更改 Firebase 上的存储设置以允许未经身份验证的访问:enter image description here

我还检查了存储链接是否正确:enter image description here

以下是访问 Firebase 存储的代码:

import UIKit
import AVKit
import AVFoundation
import FirebaseStorage

class VideoViewController: UIViewController
{
    var videoUrl:NSURL!
    var storageRef:FIRStorageReference!
    
    override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = storage.referenceForURL("gs://**********.appspot.com")
        let videosRef = storageRef.child("videos")
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
            
        videosRef.child(videoName).downloadURLWithCompletion { (URL, error) -> Void in
            if (error != nil)
            {
                print(error!)
            }
            else
            {
                self.videoUrl = URL
                
                do
                {
                    try self.playVideo()
                }
                catch
                {
                    print("Error")
                }

            }
        }
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

所以,我尝试使用直接链接,它成功了!

override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = "gs://*************.appspot.com"
        let videosRef = "videos"
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
        
        storage.referenceForURL("\(storageRef)/\(videosRef)/\(videoName)").downloadURLWithCompletion { (URL, error) in
            if (error != nil)
            {
                print(error!)
            }
            else
            {
                self.videoUrl = URL
                
                do
                {
                    try self.playVideo()
                }
                catch
                {
                    print("Error")
                }

            }
        }

当然,使用类似的直接链接并不是获取数据的最佳方式。接下来我比较了打印出来生成的两个链接。这是我打印第一个链接的方式:

var videoUrl:NSURL!
var storageRef:FIRStorageReference!
    
    override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = storage.referenceForURL("gs://*********.appspot.com")
        let videosRef = storageRef.child("videos")
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
        print(videosRef.child(videoName))

它打印了

gs://************.appspot.com/videos/video1.m4v

第二个链接:

var videoUrl:NSURL!
var storageRef:String!
    
    override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = "gs://***********.appspot.com"
        let videosRef = "videos"
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
        print("\(storageRef)/\(videosRef)/\(videoName)")

打印的内容

gs://************.appspot.com/videos/video1.m4v

现在,我还尝试打印 videoName 的值,以确保它是正确的,每次打印出来时都是 video1.m4v

我已将指向我的 Firebase 存储的链接存入银行,但我可以向您保证该链接完全正确。

有人可以向我解释一下为什么我会收到此错误吗?对我来说,一切似乎都已就位。

谢谢!

最佳答案

试试这个——如果引用的底层表示存在问题,这可能会有所帮助:

而不是:

    videosRef.child(videoName).downloadURLWithCompletion { (URL, error) -> Void in

做:

    storage.referenceForURL(String(videosRef.child(videoName))).downloadURLWithCompletion { (URL, error) -> Void in

也就是说,stringValue 的referenceForURL 执行的操作是否与直接调用不同。不应该——如果是,可能与您的 videoName 有关。也许它以斜杠结尾?您可以发布您的 videoName 的值吗?

关于ios - Firebase downloadURLWithCompletion 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37529911/

相关文章:

javascript - 如何使用 Firebase Cloud Functions 在 DataSnapshot 中查找特定值

ios - 如何修复 Realm for swift 2.0 安装报错?

ios - 火力地堡 ".read": "auth != null && auth.uid == $uid" not working as expected

ios - 在Apple iTunes中看不到新的应用内购买

ios - 突出显示要按下的按钮,并取消突出显示未按下的按钮SWIFT

swift - 在序列中使用闭包作为 'state'(状态 :next:): function mis-use or Swift limitation?

swift - iPad 纵向方向不明原因

java - 如果已知值,如何在 firebase 数据库中找到键?

javascript - 如何确定javascript已经完成了某件事

ios - wowza如何直播多个音频输入?