2012-03-04 19 views

Trả lời

30

Nếu bạn muốn đường dẫn đến thư mục chính thực sự của người dùng mà bạn có thể sử dụng:

char *realHome = getpwuid(getuid())->pw_dir; 

Full dụ:

#include <unistd.h> 
#include <sys/types.h> 
#include <pwd.h> 
#include <assert.h> 

NSString *RealHomeDirectory() { 
    struct passwd *pw = getpwuid(getuid()); 
    assert(pw); 
    return [NSString stringWithUTF8String:pw->pw_dir]; 
} 

này mang đến cho bạn đường đến nhà của người dùng , nhưng không tự động cung cấp cho bạn quyền truy cập vào thư mục đó.Như đã nêu trong bình luận, bạn có thể sử dụng con đường này cho:

  • cung cấp một thư mục mặc định lành mạnh cho mở/lưu các hộp thoại
  • phát hiện cho dù bạn đang ở trong một sandbox, bằng cách so sánh kết quả để NSHomeDirectory()
+1

Điều duy nhất nó thực sự tốt cho là thiết lập một mặc định lành mạnh cho các tập tin mở/lưu hộp thoại. Ngay bây giờ, nếu tôi đặt nó vào NSHomeDirectory() nó không thân thiện với người dùng. Hầu hết mọi người thậm chí không biết thư mục Library là gì. – Justin808

+1

Đó là một cách sử dụng tốt, một cách khác là kiểm tra xem bạn có đang ở trong sandbox hay không bằng cách so sánh nó với những gì 'NSHomeDirectory()' trả về, và tôi chắc chắn có những người khác ... – CRD

+0

tập tin thông qua 'com.apple.security.temporary-exception.files.home-relative-path. *' quyền tạm thời – Dov

10

Từ táo documentation:

Truy cập vào dữ liệu người dùng

Mac OS X con đường tìm hiểu API, phía trên layer POSIX, trở lại con đường liên quan đến container thay vì liên quan đến nhà của người dùng thư mục. Nếu ứng dụng của bạn, trước khi bạn sandbox, hãy truy cập vào vị trí trong thư mục chính thực tế của người dùng (~) và bạn đang sử dụng Cocoa hoặc Core API Foundation, sau đó, sau khi bạn bật hộp cát, mã tìm kiếm của bạn tự động sử dụng vùng chứa ứng dụng của bạn thay thế.

Để khởi chạy ứng dụng hộp cát đầu tiên của bạn, Mac OS X tự động di chuyển tệp tùy chọn chính của ứng dụng của bạn. Nếu ứng dụng của bạn sử dụng thêm tệp hỗ trợ, thực hiện một sự chuyển đổi một lần các tập tin vào container, như mô tả trong “Chuyển một App để một Sandbox.”

Nếu bạn đang sử dụng một lệnh POSIX như getpwuid để có được đường dẫn vào thư mục chính thực tế của người dùng, hãy xem xét thay vì sử dụng biểu tượng Cacao hoặc Nền tảng cốt lõi chẳng hạn như chức năng NSHomeDirectory. Bằng cách sử dụng Nền tảng Cacao hoặc Core, bạn hỗ trợ hạn chế Hộp cát ứng dụng chống lại việc truy cập trực tiếp vào thư mục chính của người dùng.

Nếu ứng dụng của bạn yêu cầu quyền truy cập vào thư mục chính của người dùng để chức năng , hãy cho Apple biết về nhu cầu của bạn bằng cách sử dụng Apple bug reporting system.

+7

thật lố bịch ... nhưng mang tính thông tin. Cảm ơn. – Dakine83

0

Sử dụng Swift, bạn có thể truy cập vào đường dẫn thư mục người dùng gia đình từ một ứng dụng sandbox như thế này:

var userHomeDirectoryPath : String { 
    let pw = getpwuid(getuid()) 
    let home = pw?.pointee.pw_dir 
    let homePath = FileManager.default.string(withFileSystemRepresentation: home!, length: Int(strlen(home))) 

    return homePath 
} 


tôi tạo này để lution dựa trên một đoạn trích trong bài đăng trên blog này: http://zpasternack.org/accessing-the-real-home-folder-from-a-sandboxed-app/