Can't Upload Video to Firebase Storage on iOS 13

故事扮演 提交于 2019-12-21 23:22:25

问题


Works perfectly fine on iOS 12.

Simple boilerplate code:

let storageRef = storage.reference().child("\(profile.studioCode)/\(selected.classId)/\(uploadDate)")

        //Upload file and metadata
        let uploadTask = storageRef.putFile(from: videoURL, metadata: metadata)

        //Listen for state changes and, errors, and completion of the upload
        uploadTask.observe(.resume) { (snapshot) in
            //upload resumed or started
        }

        uploadTask.observe(.pause) { (snapshot) in
            //upload paused
        }

        uploadTask.observe(.progress) { (snapshot) in
            //upload progress
        }

        uploadTask.observe(.success) { (snapshot) in
            //upload successful
        }

        uploadTask.observe(.failure) { (snapshot) in
            //upload failed
        }

Gives me:

Error Domain=FIRStorageErrorDomain Code=-13000 "An unknown error occurred, please check the server response."

I've updated Cocoapods and Firebase to the newest versions, tried allowing arbitrary loads, and tried signing out and back into the app to reset my auth token. In iOS 13 it throws that error immediately on upload, but on iOS 12 it uploads perfectly fine. Any help or insight would be greatly appreciated. Thanks!


回答1:


I had a similar issue but here is an easy workaround: You need to use '.putData' instead of '.putFile' and specify the MIME type on upload.

let metadata = StorageMetadata()
//specify MIME type
metadata.contentType = "video/quicktime"

//convert video url to data
if let videoData = NSData(contentsOf: videoURL) as Data? {
    //use 'putData' instead
    let uploadTask = storageRef.putData(videoData, metadata: metadata)
}



回答2:


How I ended up fixing it:

It turns out that file paths are different in iOS 13 than iOS 12:

iOS12 path:

file:///private/var/mobile/Containers/Data/Application/DF9C58AB-8DCE-401B-B0C9-2CCAC69DC0F9/tmp/12FD0C43-F9A0-4DCB-96C3-18ED83FED424.MOV

iOS13 path:

file:///private/var/mobile/Containers/Data/PluginKitPlugin/5DFD037B-AC84-463B-84BD-D0C1BEC00E4C/tmp/trim.7C8C6CD1-97E7-44D4-9552-431D90B525EA.MOV


Note the extra '.' in the iOS13 path. My solution was to, inside of my imagePickerController didFinishPickingMediaWithInfo function, copy the file into another temp directory, upload it from there, and then delete the copy.

 do {
            if #available(iOS 13, *) {
                //If on iOS13 slice the URL to get the name of the file
                let urlString = videoURL.relativeString
                let urlSlices = urlString.split(separator: ".")
                //Create a temp directory using the file name
                let tempDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
                let targetURL = tempDirectoryURL.appendingPathComponent(String(urlSlices[1])).appendingPathExtension(String(urlSlices[2]))

                //Copy the video over
                try FileManager.default.copyItem(at: videoURL, to: targetURL)

                picker.dismiss(animated: true) {
                    self.videoRecorded = false
                    self.showUpload(targetURL)
                }
            }
            else {
                //If on iOS12 just use the original URL
                picker.dismiss(animated: true) {
                    self.videoRecorded = false
                    self.showUpload(videoURL)
                }
            }
        }
        catch let error {
            //Handle errors
        }


来源:https://stackoverflow.com/questions/58104572/cant-upload-video-to-firebase-storage-on-ios-13

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!