2013-03-06 34 views
5

Tôi có một ứng dụng Main.app và một ứng dụng Helper.app trong thư mục Main.app/Library/LoginItems. Main.app có thể được người dùng bắt đầu và sau đó người dùng có thể đặt Helper.app làm mục đăng nhập. (sử dụng SMLoginItemSetEnabled()), nó hoạt động hoàn hảo. Khi người dùng đặt Helper.app làm mục đăng nhập, nó cũng được khởi chạy.ra mắt một ứng dụng helper Mac OS X (LoginItem) từ các ứng dụng chính

Tuy nhiên, bạn cũng có thể khởi chạy ứng dụng Helper.app mà không đặt nó làm mục đăng nhập. Tôi đã cố gắng để làm điều này với

[[NSWorkspace sharedWorkspace] launchApplication: newPath]; 

mà đưa ra một lsboxd : Không cho phép quá trình để khởi động ... lỗi, và với

[NSTask launchedTaskWithLaunchPath:newPath arguments: [NSArray array]]; 

Mà đưa ra một từ chối cấm-Sandbox reinit lỗi. (? Có lẽ vì Helper.app là bên Main.app)

newPath được tìm thấy như sau:

NSMutableArray *pathComponents = [NSMutableArray arrayWithArray:[[[NSBundle mainBundle] bundlePath] pathComponents]]; 
[pathComponents addObject:@"Contents"]; 
[pathComponents addObject:@"Library"]; 
[pathComponents addObject:@"LoginItems"]; 
[pathComponents addObject:@"Helper.app"]; 
[pathComponents addObject:@"Contents"]; 
[pathComponents addObject:@"MacOS"]; 
[pathComponents addObject:@"Helper"]; 
NSString *newPath = [NSString pathWithComponents:pathComponents]; 

Làm thế nào tôi có thể sửa lỗi này? :)

Cảm ơn,

+0

http://stackoverflow.com/questions/12971549/mac-os-sandbox-launching-main-application-from-helper - nó * * có thể là một vấn đề ký kết đó sẽ biến mất khi ứng dụng nằm trong cửa hàng ứng dụng – Petesh

+0

1Password (với quy trình Trình trợ giúp 1 từ) dường như có thể thực hiện và chúng được sandboxed. Tôi thực sự tự hỏi làm thế nào họ đạt được nó. –

+0

Tôi cũng đã tìm kiếm điều này và tôi đã thử nó theo cách bạn mô tả nó (ngoại trừ việc tôi đã mã hóa đường dẫn, tôi thực sự không thể hiểu tại sao bạn làm theo cách bạn làm) và nó hoạt động ngay lập tức. Tôi không biết những gì bạn đang làm sai (hoặc nếu tôi làm điều gì đó sai, mà làm cho nó làm việc cho tôi). – Sitses

Trả lời

0

Bạn cũng có thể sử dụng NSTask và launchctl. Ví dụ Hoặc bạn có thể sử dụng NSTask và tập lệnh bash. Ví dụ:

#Run Menu 
if [ $(ps -u $USERNAME | grep -v grep | grep -m1 '/Library/Menu/Menu.app/Contents/MacOS/Menu' | awk '{print $5}') ]; then 
    echo "Menu already running"; 
else 
    echo "Menu not running" 
    if [ $(users $USERNAME) == $USERNAME ]; then 
     echo "User logined" 
     echo "running menu for user $USERNAME" 
     sudo -u $USERNAME /Library/Menu/Menu.app/Contents/MacOS/Menu& 
    else 
     echo "User not logined" 
    fi 
fi 
Các vấn đề liên quan