简体   繁体   中英

Can't Upload Video to Firebase Storage on iOS 13

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!

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)
}

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
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM