Agregue la funcionalidad de "Iniciar sesión" a su aplicación MacOS en segundos
Si su aplicación se dirige a MacOS 13 o posterior, consulte esta versión moderna.
Por lo general, es un proceso complicado y propenso a los errores para agregar esto (en MacOS de 12 años o más). ¡No más!
Este paquete funciona con aplicaciones de sandboxed y no sandboxed y es compatible con la tienda de aplicaciones y se usa en aplicaciones como Plash, Dato, Lungo e Indicador de batería.
Este paquete utiliza el nuevo SMAppService en MacOS 13+ y SMLoginItemSetEnabled en versiones MacOS más antiguas.
SMAppService ?MacOS 10.13+
Agregue https://github.com/sindresorhus/LaunchAtLogin-Legacy en la pestaña "Swift Package Manager" en Xcode.
Omita este paso si su aplicación se dirige a MacOS 13 o posterior.
Agregue una nueva "fase de ejecución de script" a continuación (no en) "Copiar recursos de paquete" en "Build Fases" con lo siguiente:
" ${BUILT_PRODUCTS_DIR} /LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh "Y desmarque "basado en el análisis de dependencia".
La fase de compilación no puede ejecutarse con "Script Script Sandboxing" habilitada. Con Xcode 15 o más nuevo donde está habilitado de forma predeterminada, deshabilite el "Script Script Sandboxing" en la configuración de compilación.
(Necesita algunos trabajos adicionales para tener nuestro script para cumplir con el sandbox de fase de compilación.) (Nombraría la Copy “Launch at Login Helper” )
No es necesario almacenar ningún estado a UserDefaults.
Tenga en cuenta que las pautas de Mac App Store requieren la funcionalidad de "Iniciar sesión" para estar habilitado en respuesta a una acción del usuario. Esto generalmente se resuelve al convertirlo en una preferencia que se deshabilite de forma predeterminada. Muchas aplicaciones también permiten que el usuario lo active en una pantalla de bienvenida.
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true Este paquete viene con una Vista de LaunchAtLogin.Toggle que es como la Toggle incorporada pero con una vinculación y etiqueta predefinidas. Haga clic en la vista alternar "Iniciar sesión en el inicio de sesión" para su aplicación.
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle ( )
}
} La etiqueta predeterminada es "Launch at login" , pero se puede anular para la localización y otras necesidades:
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle {
Text ( " Launch at login " )
}
}
} Alternativamente, puede usar LaunchAtLogin.observable como un encuadernación con @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 )
}
} Simplemente suscríbase a 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 )
}
} Use LaunchAtLogin.publisher.values .
Vincule el control a la propiedad expuesta LaunchAtLogin.kvo :
import Cocoa
import LaunchAtLogin
final class ViewController : NSViewController {
@ objc dynamic var launchAtLogin = LaunchAtLogin . kvo
} 
En MacOS 12 y antes, el paquete incluye la aplicación Helper necesitada para iniciar su aplicación y copiarla en su aplicación a la hora de compilación. En MacOS 13 y posterior, llama a la API incorporada.
Asegúrese de que la fase de secuencia de comandos de ejecución de la ejecución de la elunchatlogin todavía esté por debajo de la fase de "incrustar marcos". La orden podría haberse cambiado accidentalmente.
El error de compilación generalmente se presenta como:
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
Este es el comportamiento esperado, desafortunadamente.
Sin embargo, se mostrará allí en MacOS 13 y más tarde.
Esto generalmente se causa por tener una o más construcciones más antiguas de su aplicación en algún lugar del sistema, y MacOS eligiendo una de ellas, que no tiene el ayudante de lanzamiento y, por lo tanto, no puede comenzar.
Algunas cosas que puedes probar:
DerivedData .Algunas respuestas útiles de desbordamiento de pila:
LaunchAtLogin.bundleComo se discutió aquí, este paquete intenta determinar si está haciendo una versión o depuración de construcción y limpia su instalación en consecuencia. Si le falta el paquete de su depuración o, por el contrario, su compilación de lanzamiento tiene el paquete y causa un error de firma de código, eso significa que esto ha fallado.
La determinación del script se basa en el indicador "Build Active Architecture" en la configuración de compilación. Si esto está configurado en YES , el script empaquetará la elunchatlogin para una compilación de depuración. Debe establecer este indicador en NO si planea distribuir la compilación con Codesigning.