javascript - 将视频上传到 Firebase 存储时,iOS 上的 Expo 应用程序崩溃。适用于 Android,不适用于 iOS

标签 javascript ios firebase react-native expo

我正在尝试将视频上传到 iOS 上的 Firebase 存储。 Android 工作正常。这是导致它的代码(代码中有注释显示它何时崩溃)。此外,我正在使用我自己的 iPhone 来测试它,而不是模拟器。

export const mediaUpload = async (imageObject) => {
  // getting blob from a local file a user uploads from ImagePicker
  const blob = await fetch(imageObject[0].uri);
  const blobObject = await blob.blob();

  // creating reference path in storage
  const fileRef = ref(storage, `${auth.currentUser.uid}/videos/${uuid.v4()}`);
  // ----- no crash so far... -------

  // this is the issue line
  const attemptToUpload = await uploadBytes(fileRef, blobObject);
  // ------> APP CRASHES
}

在 Android 上,这适用于图像和视频。在 iOS 上,图像可以工作,但视频会使应用程序完全崩溃。 blob 类型是 video/quicktime。为什么 uploadBytes 方法会使应用程序崩溃?

编辑:答案是 Firebase v9 似乎与 Expo 在处理视频上传到存储 100% 方面不兼容。甚至 android 在视频上传时挂起,我发现没有任何错误消息。我解决这个问题的方法是回到 Firebase 8.10.0 版本。这 100% 有效。

最佳答案

使用这种方法并在 iOS 15 上运行良好。


 const videoRef = firebase.storage().ref("video/filename");

  const metadata = { contentType: "video/mp4" };

  const blob = await new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();

    xhr.onload = function () {
      resolve(xhr.response);
    };

    xhr.ontimeout = function (e) {
      // XMLHttpRequest timed out. Do something here.

      console.log(e);
    };
    xhr.onerror = function (e) {
      console.log(e);

      reject(new TypeError("Network request failed"));
    };
    xhr.responseType = "blob";
    xhr.open("GET", fileUri, true);
    xhr.timeout = 1000 * 60;
    xhr.send(null);
  });


  var uploadTask = videoRef.put(blob, metadata);

 

  uploadTask.on(
    "state_changed",
    (snapshot) => {
      // Observe state change events such as progress, pause, and resume
      // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded
      const progress = snapshot.bytesTransferred / snapshot.totalBytes;

    

      switch (snapshot.state) {
        case firebase.storage.TaskState.PAUSED: // or 'paused'
          console.log("Upload is paused");
          break;
        case firebase.storage.TaskState.RUNNING: // or 'running'
          console.log("Upload is running");
          break;
      }
    },
    (error) => {
      console.log(error);

      // Handle unsuccessful uploads
      blob.close();
    },
    () => {
      // Handle successful uploads on complete
      // For instance, get the download URL: https://firebasestorage.googleapis.com/...
      uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {


console.log("Video file save at:",downloadURL)
       
      });
      blob.close();
    }
  );

关于javascript - 将视频上传到 Firebase 存储时,iOS 上的 Expo 应用程序崩溃。适用于 Android,不适用于 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70603238/

相关文章:

javascript - Firebase 规则 - 只读查询中的值

javascript - 我可以用什么来代替我的警报方法?

objective-c - 沿着 UIBezierPath 将 UIImage 分成两部分

javascript - 当用户返回主页时使 Javascript 跳过执行

iOS JSON 从 web 解析到 UITableView

ios - JASidePanel iOS:导航栏上的样式左键

angular - 如何仅在用户下载应用程序后获取设备 token ?

firebase - 变量值的 Firestore 安全规则日志记录

javascript - 在 jQuery Mobile 中,点击和点击有什么区别?

javascript 未运行。 Firebug 说 "reload the page to get source for: ..."