2012-07-02 78 views
19

我希望我的應用程序在用戶選擇該選項時自動啓動。我一直使用的方法在沙盒應用程序中不再被允許。如何將沙盒應用程序添加到登錄項目

我知道我必須創建一個幫手來實現這個目標嗎?有一個簡單的教程與示例代碼來激活?

我發現這個教程,但它不爲我工作:http://www.delitestudio.com/2011/10/25/start-dockless-apps-at-login-with-app-sandbox-enabled/

它是做一個非常標準的東西,我不明白爲什麼沒有可用的示例項目。

UPDATE:

我上傳了一個樣本項目:http://ge.tt/6DntY4K/v/0?c

+0

您使用Apple事件嗎? –

+0

其實我是這樣做的,但爲什麼它很重要? – Tibidabo

+0

您能否提供更多關於使用本教程不起作用的信息?例如,是否還存在沙箱限制被執行或存在其他錯誤消息? –

回答

17

您應該成功通過使用此(免責聲明:我的)tutorial,包括示例項目。

更新:我已經測試過您上傳的示例項目:它適用於我,沒有任何修改,並在登錄成功時啓動。唯一的竅門是AutoStart.app文件必須放置在/ Applications或〜/ Applications文件夾中才能在登錄時成功啓動。無論應用程序是否被沙盒化,這都是必要的。但是,恐怕沒有這方面的官方文檔。

+0

您的解決方案有效,我的機器出於某種原因不在我的機器上。大教程,謝謝! – Tibidabo

+0

本教程非常棒。但是,有沒有辦法在系統偏好設置中將該項目添加到用戶的登錄項目中?截至目前,它不在那裏。我知道這是可能的,因爲我確實有MAS的其他應用程序能夠做到這一點。 –

+0

您可以通過使用LSSharedFileList API中的(記錄不完整的)方法來實現這一點,它是啓動服務的一部分。但是,當調用它的應用程序被沙盒化時,該API將不起作用:[使用App Sandbox,您無法使用LSSharedFileList.h頭文件中的函數創建登錄項目。](http://developer.apple.com/library /mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html#//apple_ref/doc/uid/TP40011183-CH4-SW1)這樣做的MAS應用程序可能不會被沙箱化。 – Tim

1

你可以嘗試使用Service Management Framework

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

由於從http://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html引用...

要爲您的沙盒應用程序創建一個登錄項,使用Daemon中的Adding Login Items Using the Service Management FrameworkServices Programming Guide中描述的SMLoginItemSetEnabled函數(在ServiceManagement/SMLoginItem.h中聲明)。

(使用App沙盒,你不能創建使用在LSSharedFileList.h頭文件功能的登錄項目。例如,您不能使用的功能LSSharedFileListInsertItemURL,也可以通過使用功能LSRegisterURL操縱的發射服務,如國家)。

9

我剛剛在Tim's tutorial上重新完成了約100次試驗。最後我做了它的工作。雖然我第一次嘗試時發誓它有效。 在我的情況是,當我將「登錄啓動」切換到「開啓」時,我只能在登錄後看到啓動的幫助程序只有一秒鐘。然後它消失了。 手動啓動應用程序,我看到開關已關閉。

這裏是我發現:

  1. 我的包標識已經在 NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications]
  2. 列表中NSRunningApplication *app (bundle name equal to my app)的狀態是: [app isActive] == NO[app isHidden] == NO[app isTerminated] = NO

所以我對代碼做了一些修改,例如:

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

我的系統信息:Mac OS X 10.8.2,XCODE 4.6 –

+1

您可能需要添加一個'break;'在'isActive = [app ...'之後。 –

相關問題