如何访问从 Firebase 下载的 SceneKit 文件?

Posted

技术标签:

【中文标题】如何访问从 Firebase 下载的 SceneKit 文件?【英文标题】:How can I access SceneKit files downloaded from Firebase? 【发布时间】:2020-02-15 22:32:36 【问题描述】: 我有一个 ARKit 应用程序,它使用图像识别来触发 SceneKit/3D 对象文件,专门用于艺术展览。 我最近开始实施 Firebase 存储,以减少整体下载大小,而是根据用户正在使用的展览按需下载 3D 文件!

我已成功设置应用程序以将 SceneKit 文件下载到移动存储,但我现在卡住的地方是弄清楚如何从特定下载位置读取文件并继续在图像识别/AR 中工作相应地处理。

之前,当 Scenekit 文件通过应用文件夹中的 Scenekit 目录包含在初始下载中时,我会这样阅读它们:

   let ShipScene = SCNScene(named: "art.scnassets/ship.scn")

现在,我已将其更新为读取与下载 URL 相同的字符串,但图像识别不起作用。

我认为我的问题是它没有读取正确的位置,或者我可能使用了错误的功能。我已通过 TestFlight 将应用程序连接到我的手机,但仍然没有成功。

// Downloading from firebase to device URL

  let shipURL = documentsURL.appendingPathComponent("file:///var/mobile/Containers/Data/Application/QZ_Gallery/SceneKitFiles/ship.scn", isDirectory: true)


 let shipDownload = shipRef.write(toFile: shipURL)

 // Attempting to pull the file from the downloaded location

 let ShipScene = SCNScene(named:"file:///var/mobile/Containers/Data/Application/QZ_Gallery/SceneKitFiles/ship.scn" )

*** 我的问题在我包含的最后一行代码中。我正在努力确保我在正确的位置搜索以检索已下载的文件,或者我使用的功能是否适合检索本地存储在移动设备上的文件。

【问题讨论】:

超级有趣的项目。这个问题有点不清楚......您是否将 .scn 文件上传到 Firebase 存储,然后将该 URL 路径存储在 Firebase 实时数据库中?然后,当您想检索存储的文件时,您是否从 Firebase 实时数据库获取 URL 路径,然后从存储中下载文件?如果是这样,您是否浏览过该代码以查找问题,您是否可以包含不起作用的代码?请查看以下How to create a Minimal, Complete, and Verifiable example 抱歉不清楚 - 我通过 Firebase 网站将 .scn 文件直接上传到 Firebase 存储,没有使用 Firebase 数据库/Firebase 实时数据库,因为我被告知他们不能直接托管原始 .scn文件。我直接从存储下载到移动设备(URL 是下载位置)——我查看了设备容器以确认下载工作正常。现在的问题是从下载位置读取 .scn 文件,这是我在最后一行代码中尝试做的事情。 我被告知他们不能直接托管原始 .scn 文件,这是正确的。但是,RTDB 是存储 URL 路径以便于访问的理想场所。这确实是最好的解决方案;将文件上传到您的应用程序的存储中,跟踪 RTDB 中的 URL 文件,当您需要它们时,从 RTDB 获取路径并下载 .scn 文件。这是一个非常无缝的解决方案。请参阅文档Upload From A Local File 并将下载路径存储在 RTDB 中。 好吧,看来我完全误解了这个问题,我很抱歉。您只是在询问如何从本地存储访问文件(您下载的)。 【参考方案1】:

首先添加一个函数来查找包含我所有场景的容器的场景路径,然后在获取单个 .scn 文件时使用场景路径来解决。从 Firebase 存储中下载场景(不使用实时数据库)并与图像识别正确集成。

      let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

                  let scenePath = documentsURL.appendingPathComponent("Scenes")
                  if(!FileManager.default.fileExists(atPath: scenePath.absoluteString)) 
                      do 
                          try FileManager.default.createDirectory(atPath: scenePath.absoluteString, withIntermediateDirectories: true, attributes: nil)
                           catch 
                              print(error.localizedDescription);
                          
                  

           // Start Download, writing to a file




        let sceneURL = scenePath.appendingPathComponent("Ship.scn", isDirectory: true)

【讨论】:

以上是关于如何访问从 Firebase 下载的 SceneKit 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 firebase 云功能访问 bigquery 数据?

如何从 Firebase 存储访问图像?

如何从 Firebase Storage 获取下载网址?

如何使用firebase_admin从python中的firebase存储下载文件

如何从android下载firebase数据库作为CSV文件

如何从 Firebase 存储下载 URL 中删除查询字符串