在几秒钟内将“在登录处启动”功能添加到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 。