Ajoutez des fonctionnalités de «lancement à la connexion» à votre application macOS en quelques secondes
Si votre application cible MacOS 13 ou version ultérieure, consultez plutôt cette version moderne.
C'est généralement un processus très alambiqué et sujet aux erreurs pour l'ajouter (sur macOS 12 et plus). Pas plus!
Ce package fonctionne avec des applications à la fois sandboxed et non sandbox et son App Store est compatible et utilisé dans des applications comme Plash, Dato, Lungo et Battery Indicator.
Ce package utilise le nouveau SMAppService sur MacOS 13+ et SMLoginItemSetEnabled sur les anciennes versions macOS.
SMAppService existe?macOs 10.13+
Ajoutez https://github.com/sindresorhus/LaunchAtLogin-Legacy dans l'onglet "Swift Package Manager" dans Xcode.
Ignorez cette étape si votre application cible MacOS 13 ou version ultérieure.
Ajoutez une nouvelle «phase de script d'exécution» ci-dessous (pas dans) «Copier les ressources du bundle» dans «Build Phases» avec ce qui suit:
" ${BUILT_PRODUCTS_DIR} /LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh "Et décochez «basé sur l'analyse des dépendances».
La phase de build ne peut pas fonctionner avec le "sandbox de sable de script utilisateur" activé. Avec XCode 15 ou plus nouveau où il est activé par défaut, désactivez le "sandboxing de script utilisateur" dans les paramètres de build.
(Il a besoin de quelques œuvres supplémentaires pour que notre script se conforme au bac à sable de phase de construction.) (Je nommerais la Copy “Launch at Login Helper” )
Pas besoin de stocker un état à UserDefaults.
Notez que les directives Mac App Store nécessitent l'activation des fonctionnalités de «lancement à la connexion» en réponse à une action utilisateur. Ceci est généralement résolu en faisant une préférence désactivée par défaut. De nombreuses applications permettent également à l'utilisateur l'activer dans un écran de bienvenue.
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true Ce package est livré avec une vue LaunchAtLogin.Toggle qui est comme la Toggle intégrée mais avec une liaison et une étiquette prédéfinies. En cliquant sur la vue, les bascules «Lancez au connexion» pour votre application.
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle ( )
}
} L'étiquette par défaut est "Launch at login" , mais elle peut être remplacée pour la localisation et d'autres besoins:
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle {
Text ( " Launch at login " )
}
}
} Alternativement, vous pouvez utiliser LaunchAtLogin.observable comme une liaison avec @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 )
}
} Abonnez-vous simplement à 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 )
}
} Utilisez LaunchAtLogin.publisher.values .
Liez le contrôle à la propriété exposée LaunchAtLogin.kvo :
import Cocoa
import LaunchAtLogin
final class ViewController : NSViewController {
@ objc dynamic var launchAtLogin = LaunchAtLogin . kvo
} 
Sur MacOS 12 et plus tôt, le package regroupe l'application Helper nécessaire pour lancer votre application et la copie dans votre application au moment de la création. Sur MacOS 13 et plus tard, il appelle l'API intégrée.
Veuillez vous assurer que la phase de script Launchatlogin Run est toujours en dessous de la phase «Frameworks d'intégration». L'ordonnance aurait pu être accidentellement modifiée.
L'erreur de construction se présente généralement comme:
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
C'est le comportement attendu, malheureusement.
Cependant, il s'y montrera sur MacOS 13 et plus tard.
Ceci est généralement dû à avoir une ou plusieurs constructions plus anciennes de votre application se trouvant quelque part sur le système, et MacOS en choisissant une à la place, qui n'a pas l'assistant de lancement, et ne parvient donc pas à commencer.
Certaines choses que vous pouvez essayer:
DerivedData .Quelques réponses de débordement utiles:
LaunchAtLogin.bundle dans ma construction de débogage ou j'obtiens une erreur de notarisation pour la distribution d'identification du développeurComme discuté ici, ce package essaie de déterminer si vous effectuez une version ou un débogage de construction et nettoyez son installation en conséquence. Si votre version de débogage manque le bundle ou, inversement, votre version de version a le bundle et elle provoque une erreur de signature de code, cela signifie que cela a échoué.
La détermination du script est basée sur l'indicateur «Build Active Architecture Only» dans les paramètres de construction. Si cela est défini sur YES , le script emballera Launchatlogin pour une version de débogage. Vous devez définir ce drapeau sur NO si vous prévoyez de distribuer la construction avec le code de code.