Mein aktueller Code ist dies. Diese Logik funktioniert, wenn sich Ihr Gerät unter guten Bedingungen befindet. Wenn Ihr Gerät jedoch gering ist oder auf Mobilfunkdaten ausgeführt wird, scheint das System den Hintergrund -Upload zu blockieren. < /P>
Code: Select all
public func uploadAudioToFirebase(fileName: String, audioPath: URL, completion: @escaping (Result) -> Void) {
let storage = Storage.storage()
let storageRef = storage.reference()
let audioName = fileName + ".m4a"
let audioRef = storageRef.child("audios/" + audioName)
let metadata = StorageMetadata()
metadata.contentType = "audio/x-m4a"
audioRef.putFile(from: audioPath, metadata: metadata) { metadata, error in
if let error = error {
completion(.failure(error))
return
}
guard let uploadMetadata = metadata else {
completion(.failure(NSError(domain: "MetadataError", code: -1, userInfo: [NSLocalizedDescriptionKey: "No metadata available"])))
return
}
audioRef.downloadURL { (url, error) in
guard let downloadURL = url else {
completion(.failure(error!))
return
}
completion(.success(downloadURL.absoluteString))
}
}
}
< /code>
Zuerst habe ich versucht, noch kleinere Dateien zum Hochladen zu erstellen. Ich habe mit einer Datei mit einer Größe von 145 KB getestet, aber dies schien das Verhalten nicht zu ändern. Laut den Dokumenten wird das System jedoch automatisch diskretionär
Code: Select all
public func uploadAudioToFirebase(fileName: String, audioPath: URL, completion: @escaping (Result) -> Void) {
var taskId: UIBackgroundTaskIdentifier = .invalid
taskId = UIApplication.shared.beginBackgroundTask(withName: "AudioUpload") {
UIApplication.shared.endBackgroundTask(taskId)
taskId = .invalid
}
let storage = Storage.storage()
let storageRef = storage.reference()
let audioName = fileName + ".m4a"
let audioRef = storageRef.child("audios/\(audioName)")
let metadata = StorageMetadata()
metadata.contentType = "audio/x-m4a"
audioRef.putFile(from: audioPath, metadata: metadata) { metadata, error in
if let error = error {
completion(.failure(error))
if taskId != .invalid {
UIApplication.shared.endBackgroundTask(taskId)
}
return
}
audioRef.downloadURL { (url, error) in
if let error = error {
completion(.failure(error))
} else if let downloadURL = url {
completion(.success(downloadURL.absoluteString))
}
if taskId != .invalid {
UIApplication.shared.endBackgroundTask(taskId)
}
}
}
}