2012-07-02 19 views
19

Tôi muốn ứng dụng của mình tự động bắt đầu nếu người dùng chọn tùy chọn. Các phương pháp tôi đã sử dụng không được phép nữa trong các ứng dụng hộp cát.Cách thêm ứng dụng hộp cát vào các mục đăng nhập

Tôi biết tôi phải tạo người trợ giúp để đạt được điều đó? Có một hướng dẫn đơn giản với mã mẫu để hoạt động không?

tôi thấy hướng dẫn này, nhưng nó không làm việc cho tôi: http://www.delitestudio.com/2011/10/25/start-dockless-apps-at-login-with-app-sandbox-enabled/

Đó là một điều khá tiêu chuẩn để làm, tôi không hiểu tại sao không có ví dụ dự án có sẵn.

UPDATE:

Tôi đã tải lên một dự án mẫu: http://ge.tt/6DntY4K/v/0?c

+0

bạn có đang sử dụng các sự kiện của Apple không? –

+0

Thực ra tôi làm, nhưng tại sao lại quan trọng? – Tibidabo

+0

Bạn có thể cung cấp thêm thông tin về những gì không hiệu quả khi sử dụng hướng dẫn này không? Ví dụ, vẫn còn những hạn chế sandbox đang được thi hành hoặc có các thông báo lỗi khác hiện diện không? –

Trả lời

17

Bạn nên thành công bằng cách sử dụng tính năng này (tuyên bố từ chối trách nhiệm: của tôi) tutorial, bao gồm dự án mẫu.

Cập nhật: Tôi hiện đã kiểm tra dự án mẫu bạn đã tải lên: Nó hoạt động tốt với tôi, không có bất kỳ sửa đổi nào và khởi chạy khi đăng nhập thành công. Bí quyết duy nhất là tệp AutoStart.app phải được đặt trong thư mục/Applications hoặc ~/Applications để được khởi chạy thành công khi đăng nhập. Điều này là cần thiết bất kể ứng dụng có được sandbox hay không. Tuy nhiên, không có tài liệu chính thức về điều này, tôi sợ.

+0

Giải pháp của bạn hoạt động, của tôi không có trên máy tính của tôi vì một số lý do. Hướng dẫn tuyệt vời, Cảm ơn! – Tibidabo

+0

Hướng dẫn này thật tuyệt vời. Tuy nhiên, có cách nào để thêm mục vào Mục đăng nhập cho người dùng trong Tùy chọn hệ thống không? Ngay bây giờ, nó không có ở đó. Tôi biết rằng điều này là có thể bởi vì tôi có một vài ứng dụng khác từ MAS có thể làm điều này. –

+0

Bạn có thể thực hiện điều đó bằng cách sử dụng các phương thức (được ghi nhận kém) bên trong API LSSharedFileList, là một phần của Dịch vụ khởi chạy. Tuy nhiên, API sẽ không hoạt động khi ứng dụng gọi nó là hộp cát: [Với ứng dụng Sandbox, bạn không thể tạo mục đăng nhập bằng các hàm trong tệp tiêu đề LSSharedFileList.h.] (Http://developer.apple.com/library /mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html#//apple_ref/doc/uid/TP40011183-CH4-SW1) Các ứng dụng MAS thực hiện việc này có thể không phải là hộp cát. – Tim

1

Bạn có thể thử bằng cách sử dụng Service Management Framework

http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html#//apple_ref/doc/uid/10000172i-SW5-SW1

Như tham chiếu từ http://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html ...

Để tạo một mục đăng nhập cho ứng dụng hộp cát của bạn, sử dụng chức năng SMLoginItemSetEnabled (được khai báo trong ServiceManagement/SMLoginItem.h) như được mô tả trong Adding Login Items Using the Service Management Framework trong Daemons và Services Programming Guide.

(Với App Sandbox, bạn không thể tạo một mục đăng nhập sử dụng các hàm trong file LSSharedFileList.h tiêu đề. Ví dụ, bạn không thể sử dụng chức năng LSSharedFileListInsertItemURL. Cũng không phải bạn có thể thao tác các nhà nước các dịch vụ khởi động, chẳng hạn như bằng cách sử dụng chức năng LSRegisterURL).

9

Tôi vừa mới thực hiện khoảng 100 bản dùng thử trên Tim's tutorial. Cuối cùng tôi đã làm cho nó hoạt động. Mặc dù tôi thề nó làm việc khi lần đầu tiên tôi thử nó. Trong tình huống của tôi là khi tôi chuyển "Khởi chạy khi đăng nhập" thành Bật, tôi chỉ có thể thấy ứng dụng trợ giúp được khởi chạy chỉ trong một giây sau khi đăng nhập. Sau đó, nó đã biến mất. Khởi động ứng dụng theo cách thủ công, tôi thấy nút gạt đã bị tắt.

Dưới đây là những gì tôi tìm thấy:

  1. bó của tôi định đã có trong danh sách các NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications]
  2. tình trạng của NSRunningApplication *app (bundle name equal to my app) là: [app isActive] == NO, [app isHidden] == NO, [app isTerminated] = NO

Vì vậy, Tôi đã thực hiện một số sửa đổi đối với mã như:

BOOL alreadyRunning = NO; 
BOOL isActive = NO; // my modification 
NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications]; 
for (NSRunningApplication *app in running) { 

    if ([[app bundleIdentifier] isEqualToString:@"com.mybundleidentifier"]) { 
     alreadyRunning = YES; 
     isActive = [app isActive]; // my modification 
    } 
} 

if (!alreadyRunning || !isActive) { // my modification 
    .... 
+0

Thông tin hệ thống của tôi: Mac OS X 10.8.2, XCODE 4.6 –

+1

Bạn có thể muốn thêm 'break;' ngay sau 'isActive = [app ...'. –

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