2015-07-07 11 views
5

Pracuję nad aplikacją dla OSX 10.9 z szybkim, piaskownicy. Aplikacja potrzebuje dostępu do pliku bazy danych SQLite. Pozwoliłem użytkownikowi wybrać/otworzyć plik za pomocą NSOpenPanel. Następnie zapisuję ścieżkę pliku przy użyciu NSUserDefaults do późniejszego wykorzystania.dostęp do plików w piaskownicy osx aplikacji z szybkim

Chcę, aby ten plik był automatycznie otwierany za każdym razem, gdy aplikacja jest ponownie uruchamiana. Dostaję zapisaną ścieżkę od NSUserDefault, ale kiedy otworzę plik z tą ścieżką, pojawia się błąd, mówiąc, że nie mam uprawnień dostępu do pliku. (działa bez piaskownicy)

Wygląda na to, że zakładki są rozwiązaniem mojego problemu.

Czy jest dobry samouczek, jak używać zakładki z szybkim dla aplikacji osx? Jakieś inne sugestie?

Odpowiedz

0

Zakładki z zakresem zabezpieczeń są właśnie do zrobienia. dobrym punktem wyjścia jest dokumentacja Apple w piaskownicy AppStore (która zawiera przykładowy kod) i odwołanie do klasy NSFileManager.

następnie nie będzie przechowywana ścieżka w domyślnych ustawieniach użytkownika, ale dane binarne zakładki.

6

Oto moja odpowiedź, że Mam tylko pracuje w Swift 3 z niewielką pomocą z http://swiftrien.blogspot.com/2015/07/persisting-file-access-rights-between.html

import Foundation 
import Cocoa 

var bookmarks = [URL: Data]() 

func bookmarkPath() -> String 
{ 
    var url = app.applicationDocumentsDirectory 
    url = url.appendingPathComponent("Bookmarks.dict") 
    return url.path 
} 

func loadBookmarks() 
{ 
    let path = bookmarkPath() 
    bookmarks = NSKeyedUnarchiver.unarchiveObject(withFile: path) as! [URL: Data] 
    for bookmark in bookmarks 
    { 
     restoreBookmark(bookmark) 
    } 
} 

func saveBookmarks() 
{ 
    let path = bookmarkPath() 
    NSKeyedArchiver.archiveRootObject(bookmarks, toFile: path) 
} 

func storeBookmark(url: URL) 
{ 
    do 
    { 
     let data = try url.bookmarkData(options: NSURL.BookmarkCreationOptions.withSecurityScope, includingResourceValuesForKeys: nil, relativeTo: nil) 
     bookmarks[url] = data 
    } 
    catch 
    { 
     Swift.print ("Error storing bookmarks") 
    } 

} 

func restoreBookmark(_ bookmark: (key: URL, value: Data)) 
{ 
    let restoredUrl: URL? 
    var isStale = false 

    Swift.print ("Restoring \(bookmark.key)") 
    do 
    { 
     restoredUrl = try URL.init(resolvingBookmarkData: bookmark.value, options: NSURL.BookmarkResolutionOptions.withSecurityScope, relativeTo: nil, bookmarkDataIsStale: &isStale) 
    } 
    catch 
    { 
     Swift.print ("Error restoring bookmarks") 
     restoredUrl = nil 
    } 

    if let url = restoredUrl 
    { 
     if isStale 
     { 
      Swift.print ("URL is stale") 
     } 
     else 
     { 
      if !url.startAccessingSecurityScopedResource() 
      { 
       Swift.print ("Couldn't access: \(url.path)") 
      } 
     } 
    } 

} 

func allowFolder() -> URL? 
{ 
    let openPanel = NSOpenPanel() 
    openPanel.allowsMultipleSelection = false 
    openPanel.canChooseDirectories = true 
    openPanel.canCreateDirectories = true 
    openPanel.canChooseFiles = false 
    openPanel.begin 
     { (result) -> Void in 
      if result == NSFileHandlingPanelOKButton 
      { 
       let url = openPanel.url 
       storeBookmark(url: url!) 
      } 
    } 
    return openPanel.url 
} 

Aby użyć tego kodu należy najpierw zadzwonić NSOpenPanel więc użytkownik może wybrać, które foldery dać dostęp do. NSOpenPanel musi być zapisany jako zakładka i zapisany na dysku.

let url = allowFolder() 
saveBookmarks() 

Po ponownym uruchomieniu aplikacji należy zadzwonić

loadBookmarks() 

wtedy aplikacja będzie miała ten sam poziom dostępu, jak to miało miejsce, gdy użytkownik wybrał folder. Mam nadzieję, że to pomaga komuś.

Powiązane problemy