在幾秒鐘內將“在登錄處啟動”功能添加到MacOS應用
如果您的應用程序針對MACOS 13或更高版本,請查看此現代版本。
添加它通常是一個非常複雜且容易發生錯誤的過程(MacOS 12及以上)。不再!
該軟件包可與沙盒和非盒裝應用程序一起使用,並且它的App Store兼容,並用於Plash,Dato,Lungo和電池指示器等應用中。
該軟件包在MacOS 13+上使用新的SMAppService ,並在較舊的MacOS版本上使用SMLoginItemSetEnabled 。
SMAppService ,為什麼要使用此軟件包?MacOS 10.13+
在Xcode中的“ Swift Package Manager”選項卡中添加https://github.com/sindresorhus/LaunchAtLogin-Legacy 。
如果您的應用程序將MACOS 13或更高版本定為目標,則跳過此步驟。
在以下“構建階段”中添加下面的新“運行腳本階段”(不插入)“複製捆綁資源”:
" ${BUILT_PRODUCTS_DIR} /LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh "並取消選中“基於依賴分析”。
構建階段無法通過啟用“用戶腳本沙盒”運行。使用Xcode 15或默認情況下啟用XCode 15,在構建設置中禁用“用戶腳本沙箱”。
(它需要一些額外的作品才能使我們的腳本符合構建相位沙箱。 Copy “Launch at Login Helper”
無需將任何狀態存儲到UserDefaults。
請注意,Mac App Store指南需要響應用戶操作來啟用“在登錄處啟動”功能。通常,通過使其成為默認情況下禁用的偏好來解決。許多應用程序還可以讓用戶在歡迎屏幕中激活它。
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true該軟件包帶有LaunchAtLogin.Toggle視圖,該視圖類似於內置的Toggle但帶有預定義的綁定和標籤。單擊“視圖”切換為您的應用程序的“登錄處啟動”。
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle ( )
}
}默認標籤是"Launch at login" ,但可以覆蓋本地化和其他需求:
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle {
Text ( " Launch at login " )
}
}
}另外,您可以將LaunchAtLogin.observable用作@ObservedObject的綁定:
import SwiftUI
import LaunchAtLogin
struct ContentView : View {
@ ObservedObject private var launchAtLogin = LaunchAtLogin . observable
var body : some View {
Toggle ( " Launch at login " , isOn : $launchAtLogin . isEnabled )
}
} 只需訂閱LaunchAtLogin.publisher :
import Combine
import LaunchAtLogin
final class ViewModel {
private var isLaunchAtLoginEnabled = LaunchAtLogin . isEnabled
private var cancellables = Set < AnyCancellable > ( )
func bind ( ) {
LaunchAtLogin
. publisher
. assign ( to : . isLaunchAtLoginEnabled , on : self )
. store ( in : & cancellables )
}
} 使用LaunchAtLogin.publisher.values 。
將控件綁定到LaunchAtLogin.kvo暴露屬性:
import Cocoa
import LaunchAtLogin
final class ViewController : NSViewController {
@ objc dynamic var launchAtLogin = LaunchAtLogin . kvo
} 
在MacOS 12和更早的MacOS上,該軟件包捆綁了啟動您的應用程序並在構建時間將其複製到您的應用中所需的助手應用程序。在MacOS 13及以後,它稱為內置API。
請確保啟動曲霉蛋白運行腳本階段仍在“嵌入框架”階段下方。該命令本來可以意外改變。
構建錯誤通常會呈現為:
cp: […]/Resources/LaunchAtLoginHelper.app: No such file or directory
rm: […]/Resources/copy-helper.sh: No such file or directory
Command PhaseScriptExecution failed with a nonzero exit code
不幸的是,這是預期的行為。
但是,它將在Macos 13及以後的地方顯示。
這通常是由於您的應用程序的一個或多個較舊的構建在系統上的某個地方而引起的,而MacOS選擇其中一個沒有發射助手,因此無法啟動。
您可以嘗試一些事情:
DerivedData目錄。一些有用的堆棧溢出答案:
LaunchAtLogin.bundle ,或者我因開發人員ID分發而遇到公證錯誤如下所述,此軟件包試圖確定您是在發布或調試構建並相應地清理其安裝。如果您的調試構建缺少捆綁包,或者相反,您的發布構建具有捆綁包,並且會導致代碼簽名錯誤,則意味著這已失敗。
腳本的確定基於構建設置中的“僅構建活動架構”標誌。如果將其設置為YES ,則該腳本將包裝啟動login進行調試構建。如果您打算使用代碼設計構建構建,則必須將此標誌設置為NO 。