使用.obj加载“ Swift/MDLAsset”的常见方法使用类似以下代码

import ModelIO

var theURL: URL
var theAsset: MDLAsset

theURL = Bundle.main.url(forResource: "cube", withExtension: "obj")!
theAsset = MDLAsset(url: theURL)


这仅适用于应用程序主bundle中的文件(在app/Contents/Resource上的macOS中)。
但是我希望我的应用程序可以从文件系统上的任何位置读取文件。所以我尝试了以下

// 1st attempt
    theURL = URL(string: "file:///Users/me/cube.obj")!
    theAsset = MDLAsset(url: theURL)

// 2nd attempt
    theURL = URL(fileURLWithPath: "/Users/me/cube.obj")
    theAsset = MDLAsset(url: theURL)

// 3rd attempt
    theURL = URL(string: "cube.obj", relativeTo: URL(string:"/Users/me/")!)!
    theAsset = MDLAsset(url: theURL)


它们全部失败(错误消息"Could not open OBJ file")。仅当"cube.obj"文件不在app/Contents/Resources下时,才会发生这种情况。

我的天真的结论是MDLAsset似乎是近视的-仅在一个地方查看:app/Contents/Resources.

我确定必须有解决方案(除了始终将obj文件复制到应用程序的资源中)。

最佳答案

该问题并非特定于ModelIO或MDLAset。这是沙盒应用程序的普遍问题。沙盒应用程序无权访问任意用户文件,除非用户交互已授予其访问其他文件的权限,否则它只能访问自己沙盒中的文件。

例如,如果您的应用程序使用文件打开对话框(NSOpenPanel)来要求用户选择模型对象文件,而用户这样做,则您的应用程序将有权访问该文件。

关于swift - ModelIO/MDLA是近视的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59539225/

10-15 16:25