ModelIO/MDLAsset近视吗?
Is ModelIO/MDLAsset myopic?
使用 Swift/MDLAsset
加载“.obj
”的常用方法使用类似
的代码
import ModelIO
var theURL: URL
var theAsset: MDLAsset
theURL = Bundle.main.url(forResource: "cube", withExtension: "obj")!
theAsset = MDLAsset(url: theURL)
这仅适用于应用程序主 bundle
中的文件(在 macOS
上的 app/Contents/Resource
中)。
但我希望我的应用程序能够从我的文件系统上的任何位置读取文件。所以我尝试了以下
// 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 或 MDLAsset;这是沙盒应用程序的普遍问题。沙盒应用程序无法访问任意用户文件,它只能访问自己沙盒中的文件,除非用户交互已授予它对其他文件的访问权限。
例如,如果您的应用使用文件打开对话框 (NSOpenPanel
) 要求用户 select 模型对象文件,并且用户这样做了,那么您的应用程序将获得对该文件的访问权限。
使用 Swift/MDLAsset
加载“.obj
”的常用方法使用类似
import ModelIO
var theURL: URL
var theAsset: MDLAsset
theURL = Bundle.main.url(forResource: "cube", withExtension: "obj")!
theAsset = MDLAsset(url: theURL)
这仅适用于应用程序主 bundle
中的文件(在 macOS
上的 app/Contents/Resource
中)。
但我希望我的应用程序能够从我的文件系统上的任何位置读取文件。所以我尝试了以下
// 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 或 MDLAsset;这是沙盒应用程序的普遍问题。沙盒应用程序无法访问任意用户文件,它只能访问自己沙盒中的文件,除非用户交互已授予它对其他文件的访问权限。
例如,如果您的应用使用文件打开对话框 (NSOpenPanel
) 要求用户 select 模型对象文件,并且用户这样做了,那么您的应用程序将获得对该文件的访问权限。