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
và -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.
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
@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
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