2012-09-26 11 views
9

Tôi muốn khởi chạy một ứng dụng riêng của LSOpenApplication() trong Sandbox trên Mac.Làm cách nào để khởi chạy một quá trình khác trong hộp cát trên máy Mac?

Tất nhiên, tôi đã thêm hàng vào 'com.apple.security.temporary-exception.files.absolute-path.read-write' trong một tệp quyền lợi để khởi chạy.

Tuy nhiên, khi khởi chạy, bảng điều khiển sẽ phát ra lỗi không cho phép quá trình xxxx khởi chạy "foo.app" vì nó chưa được người dùng khởi chạy trước đó. Có thể khởi chạy mà không có lỗi sau khi khởi chạy quy trình thủ công một lần.

Tôi làm cách nào để khởi chạy quy trình ngay cả khi không khởi chạy trước đó? Đây có phải là mối quan hệ với hộp cát không?

+0

Nếu chỉ định theo tên (hoặc có thể là ID gói) thay vì FSRef được chấp nhận, hãy thử: http://stackoverflow.com/a/7311283/30461 –

+0

Cảm ơn. Nhưng nó không thể khởi động ngay cả khi sử dụng chức năng launchApplication với tên ứng dụng thay thế. Có lẽ, ứng dụng đích có thể cần phải có trải nghiệm được đưa ra bởi người dùng ít nhất một lần trước đây để khởi chạy bình thường trên OS X Lion và Mountain Lion. – noridon

Trả lời

0

Sử dụng osascript

osascript -e 'tell application "foo" to open' 
+0

Cảm ơn Parag. Nó có nghĩa là sử dụng osascript thay vì gọi một hàm? – noridon

+0

Tôi không biết tại sao hàm LSOpenApplication() không hoạt động trong ứng dụng Sandbox. nhưng osascript sẽ hoạt động. –

14

Có rất ít điều kiện theo đó bạn sẽ có thể khởi động một ứng dụng khác và có kết quả mong muốn. com.apple.security.temporary-exception.files.absolute-path.read-write không giúp bạn đạt được bất kỳ thứ gì liên quan đến LaunchServices để bạn có thể loại bỏ quyền đó.

Là ứng dụng hộp cát, bạn khá giới hạn ở những gì bạn thực sự có thể khởi chạy phụ, đây là một hành vi có chủ ý khi khởi chạy một ứng dụng khác về mặt kỹ thuật là vi phạm mô hình sandbox. những cách có sẵn cho bạn là:

  1. bao gồm dịch vụ XPC trong ứng dụng của bạn và có ra mắt launchd nó cho bạn
  2. bạn có thể chạy một ứng dụng thông qua NSTask, mà sẽ gây ra ứng dụng này để kế thừa sandbox của bạn khi đưa ra
  3. bạn có thể khởi chạy ứng dụng theo tên, mặc dù từ những gì tôi đã nhìn thấy thường chỉ hoạt động nếu ứng dụng nằm trong thư mục/Ứng dụng của bạn, tức là - [NSWorkspace launchỨng dụng:]
  4. bạn có thể khởi chạy ứng dụng bao quanh ứng dụng của bạn , nhưng chỉ khi bạn đã là SMLoginItemSetEnabled()

Tôi muốn gọi hàm osascript hoạt động vì nó hoạt động gần giống như - [NSWorkspace launchApplication:]. không có cuộc gọi LS nào chấp nhận số nhận dạng gói hoặc đường dẫn tuyệt đối/tương đối sẽ hoạt động.

+1

Cảm ơn! Thành công để khởi chạy từ Dịch vụ XPC! – noridon

+0

sẽ hoạt động miễn là bạn không có ý định gửi tới MacAppStore và không sandboxing Dịch vụ XPC. Nếu bạn đang gửi đến kho ứng dụng, họ sẽ buộc bạn sandbox Dịch vụ XPC. – rudy