2012-04-06 36 views
10

Tôi đang chuyển đổi ứng dụng Lion của mình để sử dụng Hộp cát ứng dụng. Tôi đang cố sử dụng tính năng security-scoped bookmarks được giới thiệu trong 10.7.3 để cho phép truy cập liên tục vào một thư mục. Mã tôi dưới đây trả về dấu trang nil và tạo thông báo tường trình sau: XPC couldn't look up the Mach service for scoped bookmarks agent.Sự cố khi tạo Dấu trang Bảo mật-Phạm vi

Tôi đặt quyền lợi User Selected File Access thành Read/Write Access và cũng đã thử và không có các cuộc gọi xung quanh ..AccessingSecurityScopedResource.

Tôi nghĩ rằng tôi đang làm mọi thứ đúng theo tài liệu, vì vậy tôi đánh giá cao bất kỳ con trỏ nào. Mã đã hoạt động để truy xuất một URL đơn giản trước khi tôi bắt đầu sandboxing ứng dụng.

NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
[openPanel setCanChooseFiles:NO]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel setAllowsMultipleSelection:NO]; 

NSInteger result = [openPanel runModal]; 

if(result == NSFileHandlingPanelCancelButton) { 
    return; 
} 

NSArray *urls = [openPanel URLs]; 

if(urls != nil && [urls count] == 1) { 
    NSURL *url = [urls objectAtIndex:0]; 

    NSData *bookmark = nil; 
    NSError *error = nil; 
    bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
      includingResourceValuesForKeys:nil 
           relativeToURL:nil // Make it app-scoped 
             error:&error]; 
    if (error) { 
     NSLog(@"Error creating bookmark for URL (%@): %@", url, error); 
     [NSApp presentError:error]; 
    } 

    NSLog(@"bookmark: %@", bookmark); 
} 

Cập nhật (x3)

Bây giờ tôi nhận nó làm việc, tôi có thể xác minh rằng các cuộc gọi đến -startAccessingSecurityScopedResource-stopAccessingSecurityScopedResource là không cần thiết trong đoạn mã trên, kể từ khi tài trợ Powerbox truy cập vào các tài nguyên sau khi người dùng chọn nó trong NSOpenPanel.

Nếu bạn đang tạo dấu trang từ một URL có phạm vi bảo mật khác, chẳng hạn như tạo dấu trang có phạm vi tài liệu từ một dấu trang được tạo trong một phiên ứng dụng khác thì bạn cần truy cập vào tệp trước.

+2

Các khởi động/dừng cuộc gọi không bao giờ cần thiết khi thực hiện một bookmark. Bạn đã có quyền truy cập từ NSOpenPanel. Dấu trang đang lưu quyền truy cập đó cho các lần chạy trong tương lai. Và những lần chạy tương lai đó là nơi bạn sẽ cần gọi startAccessingSecurityScopedResource (trên URL bạn nhận được từ việc giải quyết dấu trang). – abarnert

+0

@abarnert Tôi tin rằng bạn nói đúng, vì trong mã tôi đã đăng, tôi sử dụng 'NSOpenPanel', nhưng bạn cần nó nếu bạn đang tạo dấu trang từ một nguồn khác với' NSOpenPanel' hoặc 'NSSavePanel' (như vậy khi tạo dấu trang mới từ một dấu trang hiện có để thay đổi phạm vi của nó). Tôi đã cập nhật bài đăng của mình. – Dov

+0

Tài liệu làm cho mắt tôi chảy máu 'đến khi tôi tìm thấy' dấu trang bảo mật 'và đây cũng là mã mẫu hữu ích. Tôi không có khả năng tạo thẻ, tôi có thể đề nghị chúng tôi thêm thẻ "dấu trang bảo mật" không? – Mark

Trả lời

8

Hóa ra tôi đã mất tích một quyền rất quan trọng, không được liệt kê trong giao diện người dùng, nhưng được liệt kê trong the documentation:

com.apple.security.files.bookmarks.app-scope 
+2

Cảm ơn, quyền lợi là những gì tôi cần để thực hiện công việc này. Chỉ muốn thêm rằng tôi không đồng ý với bản cập nhật của bạn về -startAccessingSecurityScopedResource không cần thiết; nếu tôi nhận xét điều này trong mã của mình, tôi không còn có thể truy cập vào tài nguyên nữa. – escrafford

+0

Cảm ơn bạn rất nhiều vì đã chia sẻ giải pháp này. Tôi đã dành tuổi để gỡ lỗi mã của tôi chỉ để phát hiện ra rằng quyền lợi này là cần thiết trong Lion (trong Mountain Lion nó không phải là). – Nickkk

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