Powszechny sposób ładowania "{x0}}" Korzystanie {x1}} używa kodu takiego jak

import ModelIO

var theURL: URL
var theAsset: MDLAsset

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

Działa to tylko w przypadku plików w głównym katalogu aplikacji bundle (w app/Contents/Resource na macOS). Ale chciałbym, aby moja aplikacja odczytywała pliki z dowolnego miejsca na moim systemie plików. Więc spróbowałem następujących rzeczy

// 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)

Wszystkie zawiodły (z komunikatem o błędzie "Could not open OBJ file"). Dzieje się tak tylko wtedy, gdy plik "cube.obj" nie znajduje się pod app/Contents/Resources.

Mój naiwny wniosek jest taki, że MDLAsset wydaje się być krótkowzroczny - wygląda tylko w jednym miejscu: app/Contents/Resources.

Jestem pewien, że musi istnieć rozwiązanie (inne niż zawsze kopiowanie moich plików obj do zasobów aplikacji).

0
user60392 31 grudzień 2019, 06:25

1 odpowiedź

Najlepsza odpowiedź

Problem nie jest specyficzny dla ModelIO lub MDLAsset; jest to ogólny problem z aplikacjami w piaskownicy. Aplikacja w trybie piaskownicy nie ma dostępu do dowolnych plików użytkownika, może uzyskiwać dostęp tylko do plików w swojej własnej piaskownicy, chyba że interakcja użytkownika umożliwiła jej dostęp do innych plików.

Na przykład, jeśli aplikacja miałaby użyć okna dialogowego otwierania pliku (NSOpenPanel), aby poprosić użytkownika o wybranie pliku obiektu modelu, a użytkownik miałby to zrobić, wówczas aplikacja uzyskałaby dostęp do tego pliku.

0
Ken Thomases 1 styczeń 2020, 05:03