2013-07-21 30 views
6

Tôi có một ứng dụng Mac OSX khởi chạy một tệp thực thi có trong/Contents/Resources. Ứng dụng này không có ý định được phát hành trên App Store và vì vậy tôi chưa bật sandbox.Khởi chạy thực thi với NSTask - Sự cố Sandboxing?

Mã khởi động:

toolPath = [[[NSBundle mainBundle] pathForResource:@"myexecutable" ofType:@""] copy]; 
task = [[NSTask alloc] init]; 
[task setLaunchPath: toolPath]; 
pipe = [[NSPipe alloc] init]; 
[task setArguments:[NSArray arrayWithObjects:@"-someArg", someVariable, nil]]; 
file = [[NSFileHandle alloc] initWithFileDescriptor:[pipe fileHandleForReading].fileDescriptor]; 
[task setStandardOutput: stderrPipe]; 
[task launch]; 

Vấn đề là - tất cả điều này hoạt động tốt khi chạy trong Xcode. Nó cũng hoạt động tốt khi xuất ứng dụng sang máy tính để bàn và chạy nó.

Tuy nhiên, nếu tôi nén ứng dụng, tải nó lên máy chủ web và sau đó tải xuống trên cùng một máy tính (hoặc thả hộp thư đến một máy Mac khác), tác vụ không còn khởi chạy nữa! Tôi không nhận được lỗi trong bảng điều khiển hệ thống hoặc bất cứ điều gì.

Tôi đã nghiên cứu một số vấn đề này và thấy rằng OSX sẽ đánh dấu một ứng dụng mới là quyền được cho phép đặc biệt "cách ly". Vì vậy, tôi nghiên cứu sự khác biệt giữa các ứng dụng tải về và ứng dụng xuất khẩu:

Quyền về thực thi sau khi xuất khẩu ứng dụng của tôi từ Xcode:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

Tại thời điểm này, các ứng dụng hoạt động tốt và thực thi được khởi động từ một bên trong ứng dụng.

Và sau khi nén ứng dụng, tải lên máy chủ, tải về, giải nén và mở ứng dụng và chấp nhận "Ứng dụng này được tải về từ internet" đối thoại:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 
    com.apple.quarantine  26 

Tại thời điểm này không có gì xảy ra khi tôi đẩy nút trong ứng dụng của tôi.

Nếu tôi sau đó chạy xattr -rd com.apple.quarantine trên toàn bộ ứng dụng, các thông báo kiểm dịch được lấy ra:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

nhưng thực thi là vẫn không được tung ra!

Tại thời điểm này bây giờ tôi có các điều khoản sau đây trên ứng dụng máy tính để bàn của tôi:

/Contents/MacOS:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/Contents/Resources:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

Và trên tải ứng dụng tôi đã sử dụng xattr -rd trên:

/Nội dung/MacOS:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/Contents/Resources:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

Ứng dụng đầu tiên hoạt động tốt và điều thứ hai không bao giờ ra mắt thực thi. Cái quái gì đang xảy ra thế? Đó là cùng một ứng dụng, trên cùng một máy tính, với các quyền tương tự, nhưng ứng dụng đã tải xuống không hoạt động.

Sự cố này xuất hiện trên tất cả các phiên bản OSX trên các máy tính khác nhau.

Trả lời

5

Thêm com.apple.security.inherit quyền lợi cho ứng dụng trợ giúp đã giải quyết vấn đề này cho tôi.

Ứng dụng trợ giúp của tôi đã từng gặp sự cố với Could not set sandbox profile data: Operation not permitted (1) khi tôi cố bắt đầu với NSTask.

từ tài liệu của Apple:

Nếu ứng dụng của bạn sử dụng một quá trình con tạo ra với một trong hai chức năng posix_spawn hoặc lớp NSTask, bạn có thể cấu hình các tiến trình con để kế thừa sandbox của mẹ. Tuy nhiên, việc sử dụng một tiến trình con không cung cấp bảo mật được chi trả bằng cách sử dụng một dịch vụ XPC.

Để bật kế thừa hộp cát, mục tiêu con phải sử dụng chính xác hai phím quyền sở hữu Hộp cát ứng dụng: com.apple.security.app-sandboxcom.apple.security.inherit. Nếu bạn chỉ định bất kỳ quyền truy cập App Sandbox nào khác, hệ thống sẽ hủy bỏ quá trình con. Tuy nhiên, bạn có thể trao các khả năng khác cho một tiến trình con bằng cách sử dụng iCloud và các quyền lợi thông báo.

Ứng dụng chính trong dự án Xcode không bao giờ có giá trị CÓ cho quyền thừa kế.

Tôi hy vọng giải pháp này sẽ hữu ích.

+0

thx !!!! đã giúp –

+0

không có quy trình con, ứng dụng chính bị lỗi coz của sự cố này – Swati

+0

cảm ơn bạn! Tôi đã sử dụng NSTask và thêm quyền sử dụng App Sandbox = NO đã lưu tôi. – iOSDec

0

Cuối cùng tôi đã tìm ra nguyên nhân gây ra sự cố này, nó xảy ra khi cố khởi chạy tệp thực thi với NSTask ghi tệp. Kỳ lạ, điều này hoạt động tốt trong một số trường hợp như đã đề cập trong bài đăng gốc. Nhưng để làm cho nó hoạt động trên các máy tính khác, tôi đã sử dụng STPrivilegedTask để giải quyết vấn đề.

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