Piaskownica aplikacji: zakładka o zasięgu dokumentu nie rozwiązana; nie zwraca żadnego błędu
Piszesz moją aplikację i próbuję zezwolić na import / eksport wielu plików, używając pliku XML, aby się do nich odwołać. Aby zezwolić mojej aplikacji (lub innej aplikacji piaskownicy) na dostęp do plików wymienionych w XML, uwzględniam również seryjną zakładkę o zasięgu bezpieczeństwa. Serializuję go zgodnie z opisem wta odpowiedźi moje testy jednostkowe (które sąnie piaskownica) zapisuj i czytaj dane XML bez problemu. Gdy moja aplikacja rozwiąże zakładkę,NSURL
zwrócone jest zero, podobnie jakNSError
odniesienie. Ponieważ nie wierzę, że tak powinno być, dlaczego tak się dzieje? Mogę obejść go, prosząc użytkownika o wybranie pliku / katalogu za pomocąNSOpenPanel
, ale nadal chciałbym, aby zakładki działały tak, jak powinny.
Reprodukowany w projekcie testowym
Aby odtworzyć w domu, utwórz nową aplikację Cocoa w Xcode i użyj następujących Gist dla plików w projekcie:https://gist.github.com/2582589 (zaktualizowany o odpowiednią pętlę następnego widoku)
Następnie wykonajInstrukcje Apple podpisać kod projektu. Odtwarzasz problem (który przesłałem do Apple jakordar: // 11369377) klikając kolejno przyciski. Wybierasz dowolny plik na dysku (poza kontenerem aplikacji), następnie XML do wyeksportowania, a następnie ten sam XML do zaimportowania.
Mam nadzieję, że będziecie w stanie pomóc mi zrozumieć, co robię źle. Albo robię coś złego i struktura błędnie trzyma się dla siebie, albo robię to dobrze i jest całkowicie zepsuta. próbuję nieobwiniać ramy, więc co to jest? Czy jest inna możliwość?
Przykładowy kod
Eksportowanie XML dodocURL
:
<code>// After the user picks an XML (docURL) destination with NSSavePanel [targetURL startAccessingSecurityScopedResource]; NSData *bookmark = [targetURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:docURL error:&error]; [targetURL stopAccessingSecurityScopedResource]; </code>
Importowanie XML zdocURL
:
<code>// After the user selected the XML (docURL) from an NSOpenPanel NSURL *result = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:docURL bookmarkDataIsStale:nil error:&error]; </code>
Próbowałem połączyć się z tym połączeniem[docURL ..AccessingSecurityScopedResource]
, co nie miało znaczenia (zgodnie z oczekiwaniami, ponieważ docURL jest już w zasięgu po wybraniu w panelu otwartym)
Ponadto określam następujące w moimapp.entitlements
plik:
<code>com.apple.security.files.user-selected.read-write com.apple.security.files.bookmarks.app-scope com.apple.security.files.bookmarks.collection-scope </code>
Jak wspomniano powyżej, drugi krok (rozwiązanie zakładki) kończy się, ale pozostawia obaerror
iresult
zero. W trakcie wdrażania piaskownicy większość błędów, które popełniłem, zaowocowałaNSError
zwracane, co pomogło mi rozwiązać problem. Ale teraz nie ma błędu i żaden adres URL nie został rozwiązany.
Różne kroki rozwiązywania problemów
Próbowałem umieścić plik XML w piaskownicy mojej aplikacji, co nie miało znaczenia, więc dostęp do pliku XML nie stanowi problemu
Aplikacja korzysta z ARC, ale także testy jednostkowe, które się udają. Próbowałem też użyć alloc / init zamiast metody klasy autoreleased (na wszelki wypadek)
Wkleiłem kod rozpoznawania adresu URL natychmiast po utworzeniu zakładki i działa on poprawnie, tworząc adres URL z zakresem zabezpieczeń
zrobiłempo
na pierwotnie utworzonej zakładce (przed serializacją), a następnie na zakładce po deserializacji i pasują do 100%. Serializacja to nie problem
Zamieniłem rozmowę rozdzielczości naCFURLCreateByResolvingBookmarkData(..)
, bez zmian. Jeśli jest to błąd, jest obecny w interfejsie API Core Foundation, a także w warstwie Cocoa
Określanie wartości dlabookmarkDataIsStale:
nie działa
Jeśli sprecyzuję0
dlaoptions:
, wtedy jarobić odzyskaj poprawny NSURL, ale nie ma zakresu zabezpieczeń, a zatem kolejne wywołania odczytu pliku nadal nie powiodą się
Innymi słowy, deserializowana zakładka wydaje się być prawidłowa. Jeśli dane zakładki zostały uszkodzone, wątpię, aby NSURL mógł coś z tym zrobić
NSURL.h
nie zawierał żadnych przydatnych komentarzy, aby wskazać coś, co robię źle
Czy ktoś z powodzeniem korzysta z zakładek dokumentów o zasięgu zabezpieczeń w aplikacji piaskownicy? Jeśli tak, co robisz inaczej niż ja?
Żądanie wersji systemu operacyjnego
Czy ktoś mający dostęp do beta gry Mountain Lion może sprawdzić, czy mój przykładowy projekt pokazuje ten sam błąd? Jeśli jest to błąd naprawiony po Lionie, nie będę się tym przejmował. Nie jestem jeszcze w programie deweloperskim, więc nie mam dostępu. Nie jestem pewien, czy odpowiedź na to pytanie naruszyłaby NDA, ale mam nadzieję, że nie.