2012-08-30 23 views
6

Potrzebuję mojej aplikacji piaskownicy, aby ponownie otworzyć otwarty plik po ponownym uruchomieniu aplikacji. Firma Apple oferuje zakładki o zasięgu bezpieczeństwa z opcjami NSURLBookmarkCreationWithSecurityScope i NSURLBookmarkResolutionWithSecurityScope w metodach tworzenia i rozwiązywania zakładek NSURL. Jednak te flagi/opcje są dobre tylko dla wersji 10.7.3 lub nowszej i powodują, że aplikacja przed 10.7.3 nie działa.Mac App Store piaskowanie i obsługa zakładek zabezpieczonych przed 10.7.3

Jak obsługiwać zatrzymywanie/ponowne otwieranie zakładki plików dla 10.6 do 10.7.3 w aplikacji piaskownicy?

-

KONTYNUACJA: proszę zobaczyć poniżej moją odpowiedź. Problem nie został spowodowany przez użycie NSURLBookmarkCreationWithSecurityScope, ale przy użyciu metod uruchamiania i zatrzymywania zakładki o zasięgu zabezpieczeń.

+0

Domyślam się, że prawdopodobnie nie możesz. Było to niedociągnięciem w ich podejściu do piaskownicy, a dodatkowy mechanizm został dodany z tego powodu. A Apple nie jest tym, który przenosi sprawy ... – Thilo

+2

Czy jesteś pewien, że to jest przyczyną niepowodzenia? Mam aplikację (w MAS), która używa '[NSURL URLByResolvingBookmarkData: opcje zakładek: NSURLBookmarkResolutionWithSecurityScope relativeToURL: nil bookmarkDataIsStale: NO error: nil];' to działa dobrze na komputerach 10.6.8. – Patrick

+0

@Patrick - czy działa poprawnie na 10.7 - 10.7.2? (Sandbox nie działa w 10.6.8, a rozdzielczość adresu URL może po prostu zignorować wszelkie informacje o zabezpieczeniach dodane przez 10.7.3+ - tylko zgadywanie). – CRD

Odpowiedz

9

Okazuje się, że użycie NSURLBookmarkCreationWithSecurityScope nie powoduje problemu z 10.7 - 10.7.2. Przyczyną niepowodzenia jest wywołanie -[NSURL startAccessingSecurityScopedResource]:, które nie jest obsługiwane przed 10.7.3. Dlatego należy zawijać wywołania tej metody (i odpowiadającej jej metody zatrzymania) za pomocą sprawdzenia systemu operacyjnego lub testu respondsToSelector. Przetestowałem, że zakładka nadal działa w wersji 10.7.1, o ile upewnisz się, że nie chcesz wywoływać startu/stopu.

Oto niektóre urywek kodu za korzystanie respondsToSelector że pomoże żadnych innych, które działają w ten problem:

Użyj tego, aby rozpocząć użytkowanie:

if([bookmarkFileURL respondsToSelector:@selector(startAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL startAccessingSecurityScopedResource]; // start using bookmarked resource 
} 

I przestać Zastosowanie:

if([bookmarkFileURL respondsToSelector:@selector(stopAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL stopAccessingSecurityScopedResource]; // stop using bookmarked resource 
} 
+1

Dlaczego po prostu nie używaj funkcji replysToSelector zamiast sprawdzać wersję systemu operacyjnego? –

+0

@ Ben-Uri Masz rację, 'responsesToSelector' jest lepszą implementacją niż sprawdzanie wersji systemu operacyjnego. Zaktualizowałem odpowiedź. – spurgeon