2015-07-07 17 views
5

Tôi đang làm việc trên một ứng dụng cho OSX 10.9 với hộp cát nhanh chóng. Ứng dụng cần quyền truy cập vào tệp cơ sở dữ liệu SQLite. Tôi cho phép người dùng chọn/mở một tệp bằng NSOpenPanel. Sau đó tôi lưu đường dẫn tệp bằng NSUserDefaults để sử dụng sau này.truy cập tệp trong ứng dụng osx sandboxed với swift

Tôi muốn tệp này được mở tự động mỗi khi ứng dụng được bắt đầu lại. Tôi nhận được đường dẫn được lưu trữ từ NSUserDefault, nhưng khi tôi mở tập tin với đường dẫn này tôi nhận được một lỗi, nói rằng tôi không có quyền truy cập vào tập tin. (đang hoạt động mà không có hộp cát)

Dường như dấu trang là giải pháp cho vấn đề của tôi.

Có hướng dẫn hay về cách sử dụng dấu trang nhanh chóng cho ứng dụng OSX không? Bất kỳ đề xuất nào khác?

Trả lời

0

dấu trang bảo mật là cách chính xác. điểm khởi đầu tốt là tài liệu hướng dẫn táo trên hộp cát AppStore (bao gồm mã mẫu) và tham chiếu lớp của NSFileManager.

bạn sau đó sẽ không lưu trữ đường dẫn mặc định của người dùng nhưng dữ liệu nhị phân của dấu trang.

6

Dưới đây là câu trả lời của tôi mà tôi đã chỉ có làm việc trong Swift 3 với một chút giúp đỡ từ 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 
} 

Để sử dụng mã này trước tiên bạn phải gọi NSOpenPanel vì vậy người dùng có thể chọn thư mục để cung cấp cho bạn truy cập vào. NSOpenPanel phải được lưu trữ dưới dạng dấu trang và được lưu vào đĩa.

let url = allowFolder() 
saveBookmarks() 

Khi bạn khởi động lại ứng dụng mà bạn phải gọi

loadBookmarks() 

sau đó ứng dụng của bạn sẽ có cùng một mức độ truy cập như nó đã làm khi người dùng chọn thư mục. Hy vọng điều này sẽ giúp một ai đó.

Các vấn đề liên quan