Adicione a funcionalidade “Lançar no login” ao seu aplicativo MacOS em segundos
Se o seu aplicativo tem como alvo o MacOS 13 ou posterior, confira esta versão moderna.
Geralmente é um processo bastante complicado e propenso a erros para adicionar isso (no macOS 12 ou mais). Não mais!
Este pacote funciona com aplicativos de caixa de areia e sem areia e é compatível com a App Store e usados em aplicativos como Plash, Dato, Lungo e Indicador de Bateria.
Este pacote usa o novo SMAppService no MacOS 13+ e SMLoginItemSetEnabled nas versões MacOS mais antigas.
SMAppService ?MacOS 10.13+
Adicione https://github.com/sindresorhus/LaunchAtLogin-Legacy na guia "Swift Package Manager" no Xcode.
Pule esta etapa se o seu aplicativo tem como alvo o MacOS 13 ou posterior.
Adicione uma nova "fase de script de execução" abaixo (não em) "Copy Bundle Resources" em "Build Fases" com o seguinte:
" ${BUILT_PRODUCTS_DIR} /LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh "E desmarque "com base na análise de dependência".
A fase de construção não pode ser executada com o "script de usuário do usuário" ativado. Com o Xcode 15 ou mais recente, onde está ativado por padrão, desative o "Script de script do usuário" nas configurações de construção.
(Ele precisa de alguns trabalhos extras para ter nosso script para cumprir a caixa de areia da fase de construção.) (Eu nomearia a Copy “Launch at Login Helper” )
Não há necessidade de armazenar qualquer estado para o usuário -defensor.
Observe que as diretrizes da Mac App Store exigem que a funcionalidade “inicie no login” seja ativada em resposta a uma ação do usuário. Isso geralmente é resolvido, tornando -o uma preferência desativada por padrão. Muitos aplicativos também permitem que o usuário o ative em uma tela de boas -vindas.
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true Este pacote vem com uma visualização LaunchAtLogin.Toggle , que é como a Toggle embutida, mas com uma ligação e etiqueta predefinidos. Clicar no visualizar alterna “inicie no login” para o seu aplicativo.
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle ( )
}
} O rótulo padrão é "Launch at login" , mas pode ser substituído para localização e outras necessidades:
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle {
Text ( " Launch at login " )
}
}
} Como alternativa, você pode usar LaunchAtLogin.observable como uma ligação com @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 )
}
} Basta assinar o 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 o LaunchAtLogin.publisher.values .
Ligue o controle à propriedade exposta do LaunchAtLogin.kvo :
import Cocoa
import LaunchAtLogin
final class ViewController : NSViewController {
@ objc dynamic var launchAtLogin = LaunchAtLogin . kvo
} 
No MacOS 12 e anterior, o pacote empacota o aplicativo auxiliar necessário para iniciar seu aplicativo e copia -o para o seu aplicativo no horário de construção. No MacOS 13 e mais tarde, ele chama a API embutida.
Certifique -se de que a fase de script de execução do LaunchAtLogin ainda esteja abaixo da fase "incorporar estruturas". O pedido poderia ter sido alterado acidentalmente.
O erro de construção geralmente se apresenta 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
Esse é o comportamento esperado, infelizmente.
No entanto, ele mostrará lá no MacOS 13 e mais tarde.
Isso geralmente é causado por ter uma ou mais construções mais antigas do seu aplicativo em algum lugar do sistema, e o MacOS escolhendo um deles, que não possui o ajudante de lançamento e, portanto, deixa de iniciar.
Algumas coisas que você pode tentar:
DerivedData .Algumas respostas úteis de transbordamento de pilha:
LaunchAtLogin.bundle em minha construção de depuração ou recebo um erro de notarização para distribuição de ID do desenvolvedorConforme discutido aqui, este pacote tenta determinar se você está fazendo uma versão de lançamento ou depuração e limpe a instalação de acordo. Se a sua construção de depuração estiver perdendo o pacote ou, inversamente, sua construção de lançamento tem o pacote e causa um erro de assinatura de código, isso significa que isso falhou.
A determinação do script é baseada no sinalizador "Build Active Architecture" nas configurações de construção. Se isso estiver definido como YES , o script empacotará o lançamento do lançamento para uma construção de depuração. Você deve definir esse sinalizador para NO se planejar distribuir a compilação com o código de código.