أضف وظيفة "التشغيل في تسجيل الدخول" إلى تطبيق MacOS الخاص بك بالثواني
إذا كان تطبيقك يستهدف MacOS 13 أو أحدث ، تحقق من هذا الإصدار الحديث بدلاً من ذلك.
عادة ما تكون عملية معرضة للمعرضة للخطأ لإضافة هذا (على MacOS 12 وما فوق). لا أكثر!
تعمل هذه الحزمة مع كل من التطبيقات الرملية وغير المغطاة ببوكس ، وهي متوافقة مع متجر التطبيقات وتستخدم في تطبيقات مثل Plash و Dato و Lungo ومؤشر البطارية.
تستخدم هذه الحزمة SMAppService الجديدة على MacOS 13+ و SMLoginItemSetEnabled على إصدارات MacOS الأقدم.
SMAppService ؟ماكوس 10.13+
أضف https://github.com/sindresorhus/LaunchAtLogin-Legacy في علامة التبويب "Swift Package Manager" في XCode.
تخطي هذه الخطوة إذا كان تطبيقك يستهدف MacOS 13 أو أحدث.
أضف "مرحلة البرنامج النصي" الجديدة أدناه (وليس إلى) "نسخ موارد حزمة" في "مراحل البناء" مع ما يلي:
" ${BUILT_PRODUCTS_DIR} /LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh "وإلغاء تحديد "بناء على تحليل التبعية".
لا يمكن تشغيل مرحلة الإنشاء مع تمكين "Sandboxing Script Script". باستخدام XCode 15 أو أحدث مكان يتم تمكينه افتراضيًا ، قم بتعطيل "Sandboxing user script" في إعدادات الإنشاء.
(يحتاج إلى بعض الأعمال الإضافية للحصول على البرنامج النصي الخاص بنا للامتثال لصندوق مرحلة البناء.) (أود تسمية Copy “Launch at Login Helper” )
لا حاجة لتخزين أي ولاية إلى userDefaults.
لاحظ أن إرشادات MAC App Store تتطلب تمكين وظيفة "التشغيل في تسجيل الدخول" استجابةً لإجراء المستخدم. عادة ما يتم حل هذا عن طريق جعله تفضيلًا معاقًا افتراضيًا. تسمح العديد من التطبيقات أيضًا للمستخدم بتنشيطه في شاشة ترحيب.
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true تأتي هذه الحزمة مع عرض LaunchAtLogin.Toggle الذي يشبه Toggle المدمج ولكن مع ربط وعلامة محددة مسبقًا. النقر فوق عرض تبديل "التشغيل في تسجيل الدخول" لتطبيقك.
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle ( )
}
} التسمية الافتراضية هي "Launch at login" ، ولكن يمكن تجاوزها للتوطين والاحتياجات الأخرى:
struct ContentView : View {
var body : some View {
LaunchAtLogin . Toggle {
Text ( " Launch at login " )
}
}
} بدلاً من ذلك ، يمكنك استخدام LaunchAtLogin.observable كملزمة مع @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 )
}
} مجرد اشتراك في 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 )
}
} استخدام LaunchAtLogin.publisher.values .
ربط عنصر التحكم إلى خاصية LaunchAtLogin.kvo المكشوفة:
import Cocoa
import LaunchAtLogin
final class ViewController : NSViewController {
@ objc dynamic var launchAtLogin = LaunchAtLogin . kvo
} 
على MacOS 12 وما قبل الحزمة ، يحدد الحزمة تطبيق Helper اللازم لإطلاق التطبيق الخاص بك ونسخه في تطبيقك في وقت الإنشاء. على MacOS 13 وبعد ذلك ، يدعو واجهة برمجة التطبيقات المدمجة.
يرجى التأكد من أن مرحلة SCRIPT RUN LANGHATLOGIN لا تزال أقل من مرحلة "أطراف التضمين". كان من الممكن تغيير الطلب عن طريق الخطأ.
عادة ما يعرض خطأ البناء نفسه على النحو التالي:
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
هذا هو السلوك المتوقع ، لسوء الحظ.
ومع ذلك ، سوف تظهر هناك على MacOS 13 ثم في وقت لاحق.
عادةً ما يحدث هذا بسبب وجود مباني أقدم أو أكثر من تطبيقك في مكان ما على النظام ، واختيار MacOs أحد هؤلاء بدلاً من ذلك ، والذي لا يحتوي على مساعد الإطلاق ، وبالتالي فشل في البدء.
بعض الأشياء التي يمكنك تجربتها:
DerivedData .بعض الإجابات المفيدة للمكدس:
LaunchAtLogin.bundle في بناء التصحيح الخاص بي أو أحصل على خطأ توثيق لتوزيع معرف المطوركما تمت مناقشته هنا ، تحاول هذه الحزمة تحديد ما إذا كنت تقوم بإصدار أو تصحيح تصحيح وتنظيف التثبيت وفقًا لذلك. إذا كان بناء تصحيح الأخطاء الخاص بك يفتقد الحزمة ، أو على العكس ، فإن بناء الإصدار الخاص بك يحتوي على الحزمة ويؤدي إلى خطأ في توقيع الكود ، فهذا يعني أن هذا قد فشل.
يعتمد قرار البرنامج النصي على علامة "بناء بنية نشطة فقط" في إعدادات الإنشاء. إذا تم تعيين هذا على YES ، فسيقوم البرنامج النصي بتعبئة LaunchAtLogin لبناء تصحيح الأخطاء. يجب عليك تعيين هذه العلامة على NO إذا كنت تخطط لتوزيع البناء باستخدام التصميم.