2014-09-28 49 views
27

在我的Mac應用程序中,我一直在使用SMCopyAllJobDictionaries()來檢查應用程序是否會在登錄時自動啓動。基本上,我得到所有登錄項的數組,並檢查我的Bundle ID是否在數組中。檢查應用程序是否是OS X優勝美地的登錄項目

此函數調用一直運行到小牛,但是是deprecated in Yosemite。根據Apple的說法,

此例程已被棄用,將在未來版本中刪除。將不會提供替代品。

但是,我怎樣才能在優勝美地做同樣的工作?我必須檢查我的應用程序是否在登錄項目列表中,以便正確顯示覆選框。我找不到Apple的相關文檔。

+0

請注意,'LSSharedFileList'不再適用於啓用沙箱。另請參閱stackoverflow.com/a/12629184/284811。我需要對我的應用程序進行沙盒處理,因爲它是通過Mac App Store分發的。 – 2014-10-12 14:11:35

+0

您不需要替換'SMCopyAllJobDictionaries',請參閱我的答案在這裏http://stackoverflow.com/questions/32546893/smcopyalljobdictionaries-and-smjobcopydictionary-is-deprecated-so-what-are-thei – 2016-06-07 08:49:57

回答

1

我正在使用LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL)達到類似目的。以Nick Moore的答案How do you make your App open at login?爲例。

請注意,這適用於登錄項目,但可能不適用於啓動的作業。

+1

不幸的是'LSSharedFileList '不再適用於沙箱啓用。也請參閱http://stackoverflow.com/a/12629184/284811。我需要對我的應用程序進行沙盒處理,因爲它是通過Mac App Store分發的。 – 2014-10-12 10:13:58

11

經過一番研究發現,這段時期並沒有簡單的答案。在測試了包括F.lux和BetterSnapTool在內的多個應用程序之後,我已經能夠輕鬆地將他們的用戶界面從系統偏好設置中去除。如果我在任何這些應用程序中啓用「啓動時啓動」,則將其從系統首選項中的項目部分中刪除,然後重新啓動它們,它們的界面仍然認爲它們設置爲在啓動時啓動。與他們的複選框交互不會執行任何操作,因爲應用程序試圖從他們不再屬於的列表中刪除自己,並且需要第二次點擊才能執行任何操作。

對我來說,這表示他們將自己的內部狀態保持爲BOOL並將其保存在啓動之間,並且根本沒有辦法讓列表與優勝美地同步。如果有人不知道我會給他們賞金。

+1

Thx爲調查!這真的很奇怪,在我看來,蘋果似乎完全沒有這個功能。 – 2015-07-26 20:28:27

+0

沒問題。它看起來確實如此。猜猜我們只需要看。 – Metabble 2015-07-27 01:06:26

+0

感謝分享調查結果,有一種感覺是這樣的。合理的解決方案是在應用程序啓動時運行後臺檢查,並簡單地同步所設置的首選項。 – 2016-03-29 08:12:35

2

從WWDC 2017開始,Apple工程師表示這仍然是首選的API。

但是,使用此API將導致您的構建失敗。不要關閉所有棄用的功能警告。相反,爲了使您的應用程序進行編譯,包裝SMCopyAllJobDictionaries有以下幾點:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    CFArrayRef cfJobDicts = SMCopyAllJobDictionaries(kSMDomainUserLaunchd); 
#pragma clang diagnostic pop 

如果這個問題對您的應用程序重要的,你希望蘋果提供一個乾淨的解決方案,請向雷達;這有助於Apple工程師確定工作項目的優先級。

+0

謝謝!你在哪裏看到這個聲明,請你提供一個鏈接? – 2017-06-19 18:52:17