Fügen Sie Ihrer MacOS -App in Sekundenschnelle "Start bei Login" -Funktionalität hinzu
Wenn Ihre App auf MacOS 13 oder später abzielt, lesen Sie stattdessen diese moderne Version.
Es ist normalerweise ein ziemlich verwickeltes und fehleranfälliger Prozess, dies hinzuzufügen (auf MacOS 12 und älter). Nicht mehr!
Dieses Paket funktioniert sowohl mit sandboxten als auch mit nicht sandkasten-Apps und es ist ein App Store kompatibel und wird in Apps wie Plash, Dato, Lungo und Battery Indicator verwendet.
Dieses Paket verwendet den neuen SMAppService auf macOS 13+ und SMLoginItemSetEnabled in älteren MacOS -Versionen.
SMAppService existiert?macOS 10.13+
Fügen Sie https://github.com/sindresorhus/LaunchAtLogin-Legacy legacy in der Registerkarte "Swift Paket Manager" in Xcode hinzu.
Überspringen Sie diesen Schritt, wenn Ihre App auf MacOS 13 oder höher abzielt.
Fügen Sie unten eine neue "Skriptphase" unten (nicht in) "Bündelressourcen zu kopieren" in "Erstellen Sie Phasen" mit Folgendem hinzu:
" ${BUILT_PRODUCTS_DIR} /LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh "Und deaktivieren Sie „basierend auf der Abhängigkeitsanalyse“.
Die Build -Phase kann nicht mit aktiviertem "Benutzerskript -Sandboxing" ausgeführt werden. Deaktivieren Sie mit Xcode 15 oder neuer, wo es standardmäßig aktiviert ist, in den Build -Einstellungen "Benutzerskript -Sandboxing".
(Es benötigt einige zusätzliche Arbeiten, um unser Skript zu haben, um die Sandbox für Build -Phase einzuhalten.) (Ich würde das Run -Skript Copy “Launch at Login Helper” ))
Es ist nicht erforderlich, Status in UserDefaults zu speichern.
Beachten Sie, dass die MAC App Store -Richtlinien für die Funktionalität „Start bei Anmeldung“ als Antwort auf eine Benutzeraktion aktiviert werden müssen. Dies wird normalerweise gelöst, indem es standardmäßig eine Präferenz macht, die deaktiviert ist. Viele Apps lassen es vom Benutzer auch in einem Willkommensbildschirm aktivieren.
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true Dieses Paket ist mit einer LaunchAtLogin.Toggle Ansicht ausgestattet, die wie der integrierte Toggle jedoch eine vordefinierte Bindung und Beschriftung aussieht. Wenn Sie auf die Ansicht klicken, werden für Ihre App „Start bei Login“ umgeschaltet.
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle ( )
}
} Das Standardetikett ist "Launch at login" , kann jedoch für die Lokalisierung und andere Anforderungen überschrieben werden:
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle {
Text ( " Launch at login " )
}
}
} Alternativ können Sie LaunchAtLogin.observable als Bindung mit @ObservedObject verwenden:
import SwiftUI
import LaunchAtLogin
struct ContentView : View {
@ ObservedObject private var launchAtLogin = LaunchAtLogin . observable
var body : some View {
Toggle ( " Launch at login " , isOn : $launchAtLogin . isEnabled )
}
} Abonnieren Sie einfach 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 )
}
} Verwenden Sie LaunchAtLogin.publisher.values .
Binden Sie die Steuerung an die LaunchAtLogin.kvo Exponierte Eigenschaft:
import Cocoa
import LaunchAtLogin
final class ViewController : NSViewController {
@ objc dynamic var launchAtLogin = LaunchAtLogin . kvo
} 
Auf macOS 12 und früher bündelt das Paket die Helfer -App, die Sie benötigen, um Ihre App zu starten, und kopiert sie zum Bauzeit in Ihre App. Auf macOS 13 und später ruft es die integrierte API auf.
Bitte stellen Sie sicher, dass die Phase des LaunchatLogin -Laufskripts weiterhin unter der Phase „Embed Frameworks“ liegt. Die Bestellung hätte versehentlich geändert werden können.
Der Build -Fehler zeigt sich normalerweise als:
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
Dies ist leider das erwartete Verhalten.
Es wird jedoch dort auf MacOS 13 und später angezeigt.
Dies wird normalerweise dadurch verursacht, dass ein oder mehrere ältere Builds Ihrer App irgendwo auf dem System liegen, und MacOS, die stattdessen einen dieserjenigen auswählen, die nicht den Starthelfer haben und damit nicht beginnen.
Einige Dinge können Sie versuchen:
DerivedData Verzeichnis.Einige hilfreiche Stapelüberlauf -Antworten:
LaunchAtLogin.bundle in meinem Debug -Build nicht sehen, oder ich erhalte einen Notarisierungsfehler für die Entwickler -ID -VerteilungWie hier erläutert, versucht dieses Paket festzustellen, ob Sie eine Veröffentlichung oder Debugg -Build erstellen und seine Installation entsprechend bereinigen. Wenn in Ihrem Debug -Build das Bundle fehlt oder umgekehrt Ihr Release -Build das Bundle hat und einen Code -Signierfehler verursacht, bedeutet dies, dass dies fehlgeschlagen ist.
Die Feststellung des Skripts basiert auf dem Flag „Nur Build Active Architecture“ in den Build -Einstellungen. Wenn dies auf YES eingestellt ist, wird das Skript Launchatlogin für einen Debug -Build verpackt. Sie müssen dieses Flag auf NO festlegen, wenn Sie vorhaben, den Build mit Codessigning zu verteilen.