Tambahkan fungsionalitas "Luncurkan di Login" ke aplikasi MacOS Anda dalam hitungan detik
Jika aplikasi Anda menargetkan macOS 13 atau lebih baru, lihat versi modern ini sebagai gantinya.
Biasanya proses yang berbelit-belit dan rawan kesalahan untuk menambahkan ini (pada macOS 12 dan lebih tua). Tidak ada lagi!
Paket ini berfungsi dengan aplikasi kotak pasir dan non-sandbox dan kompatibel dengan App Store dan digunakan dalam aplikasi seperti Plash, Dato, Lungo, dan Indikator Baterai.
Paket ini menggunakan SMAppService baru pada macOS 13+ dan SMLoginItemSetEnabled pada versi macOS yang lebih lama.
SMAppService ada?MacOS 10.13+
Tambahkan https://github.com/sindresorhus/LaunchAtLogin-Legacy di tab "Swift Package Manager" di Xcode.
Lewati langkah ini jika aplikasi Anda menargetkan macOS 13 atau lebih baru.
Tambahkan "Fase Skrip Jalankan" baru di bawah ini (tidak ke) "Salin Sumber Daya Bundel" di "Bangun Fase" dengan yang berikut:
" ${BUILT_PRODUCTS_DIR} /LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh "Dan hapus centang "berdasarkan analisis ketergantungan".
Fase build tidak dapat dijalankan dengan "sandboxing skrip pengguna" diaktifkan. Dengan Xcode 15 atau yang lebih baru di mana diaktifkan secara default, nonaktifkan "Sandboxing Skrip Pengguna" di Pengaturan Bangun.
; Copy “Launch at Login Helper”
Tidak perlu menyimpan keadaan apa pun ke UserDefaults.
Perhatikan bahwa pedoman Mac App Store memerlukan fungsionalitas "peluncuran saat login" untuk diaktifkan sebagai respons terhadap tindakan pengguna. Ini biasanya diselesaikan dengan menjadikannya preferensi yang dinonaktifkan secara default. Banyak aplikasi juga membiarkan pengguna mengaktifkannya di layar selamat datang.
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true Paket ini dilengkapi dengan tampilan LaunchAtLogin.Toggle yang seperti Toggle bawaan tetapi dengan ikatan dan label yang telah ditentukan sebelumnya. Mengklik tampilan Toggles "Luncurkan di Login" untuk aplikasi Anda.
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle ( )
}
} Label default adalah "Launch at login" , tetapi dapat ditimpa untuk lokalisasi dan kebutuhan lainnya:
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle {
Text ( " Launch at login " )
}
}
} Atau, Anda dapat menggunakan LaunchAtLogin.observable sebagai ikatan dengan @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 )
}
} Cukup berlangganan 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 )
}
} Gunakan LaunchAtLogin.publisher.values .
Bind Kontrol ke Properti LaunchAtLogin.kvo :
import Cocoa
import LaunchAtLogin
final class ViewController : NSViewController {
@ objc dynamic var launchAtLogin = LaunchAtLogin . kvo
} 
Pada MacOS 12 dan sebelumnya, paket tersebut mengikat aplikasi helper yang diperlukan untuk meluncurkan aplikasi Anda dan menyalinnya ke aplikasi Anda pada waktu build. Pada MacOS 13 dan kemudian, ia memanggil API bawaan.
Harap pastikan bahwa fase skrip Run LaunchatLogin masih di bawah fase "Embed Frameworks". Perintah itu bisa diubah secara tidak sengaja.
Kesalahan pembangunan biasanya menampilkan dirinya sebagai:
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
Sayangnya, ini adalah perilaku yang diharapkan.
Namun, itu akan ditampilkan di macOS 13 dan yang lebih baru.
Ini biasanya disebabkan oleh memiliki satu atau lebih bangunan yang lebih tua dari aplikasi Anda berbaring di suatu tempat di sistem, dan macOS memilih salah satunya, yang tidak memiliki penolong peluncuran, dan dengan demikian gagal memulai.
Beberapa hal yang dapat Anda coba:
DerivedData .Beberapa jawaban overflow tumpukan yang membantu:
LaunchAtLogin.bundle dalam pembuatan debug saya atau saya mendapatkan kesalahan notaris untuk distribusi ID pengembangSeperti yang dibahas di sini, paket ini mencoba untuk menentukan apakah Anda membuat rilis atau debug membangun dan membersihkan pemasangannya. Jika debug build Anda tidak ada bundel atau, sebaliknya, rilis Anda memiliki bundel dan menyebabkan kesalahan penandatanganan kode, itu berarti ini telah gagal.
Penentuan skrip didasarkan pada bendera "Build Active Architecture" dalam pengaturan Build. Jika ini diatur ke YES , maka skrip akan mengemas LaunchatLogin untuk Debug Build. Anda harus mengatur bendera ini ke NO jika Anda berencana untuk mendistribusikan build dengan coderigning.