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.

questionAnswers(1)

yourAnswerToTheQuestion