เพิ่มฟังก์ชั่น“ Launch At Login” ลงในแอพ MacOS ของคุณในไม่กี่วินาที
หากแอปของคุณกำหนดเป้าหมายมาที่ MacOS 13 หรือใหม่กว่าให้ตรวจสอบเวอร์ชันที่ทันสมัยนี้แทน
โดยปกติแล้วจะค่อนข้างเป็นกระบวนการที่ซับซ้อนและผิดพลาดในการเพิ่มสิ่งนี้ (บน MacOS 12 ขึ้นไป) ไม่มีอีกแล้ว!
แพ็คเกจนี้ใช้งานได้กับทั้งแอพ Sandboxed และ Non-Sandboxed และเป็นแอพที่เข้ากันได้กับ App Store และใช้ในแอพเช่น Plash, Dato, Lungo และแบตเตอรี่
แพ็คเกจนี้ใช้ SMAppService ใหม่บน MacOS 13+ และ SMLoginItemSetEnabled บนรุ่น MacOS รุ่นเก่า
SMAppService มีอยู่?macOS 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 "และยกเลิกการเลือก“ ขึ้นอยู่กับการวิเคราะห์การพึ่งพา”
เฟสบิลด์ไม่สามารถทำงานได้ด้วยการเปิดใช้งาน "สคริปต์สคริปต์แซนด์บ็อกซ์" ด้วย Xcode 15 หรือใหม่กว่าที่เปิดใช้งานโดยค่าเริ่มต้นปิดการใช้งาน "สคริปต์สคริปต์ sandboxing" ในการตั้งค่าการสร้าง
(ต้องการงานพิเศษบางอย่างเพื่อให้สคริปต์ของเราสอดคล้องกับ Build Phase Sandbox) (ฉันจะตั้งชื่อ Copy “Launch at Login Helper” )
ไม่จำเป็นต้องจัดเก็บสถานะใด ๆ ไปยังผู้ใช้
โปรดทราบว่าแนวทางของ Mac App Store ต้องใช้ฟังก์ชัน“ เปิดตัวที่เข้าสู่ระบบ” เพื่อเปิดใช้งานเพื่อตอบสนองต่อการกระทำของผู้ใช้ สิ่งนี้มักจะแก้ไขได้โดยทำให้การตั้งค่าที่ถูกปิดใช้งานโดยค่าเริ่มต้น แอพจำนวนมากยังให้ผู้ใช้เปิดใช้งานในหน้าจอต้อนรับ
import LaunchAtLogin
print ( LaunchAtLogin . isEnabled )
//=> false
LaunchAtLogin . isEnabled = true
print ( LaunchAtLogin . isEnabled )
//=> true แพ็คเกจนี้มาพร้อมกับ LaunchAtLogin.Toggle View ซึ่งเป็นเหมือน 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 เป็น binding กับ @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 และหลังจากนั้นจะเรียก API ในตัว
โปรดตรวจสอบให้แน่ใจว่าขั้นตอนการเรียกใช้สคริปต์ Launchatlogin ยังคงต่ำกว่าขั้นตอน“ Embed Frameworks” คำสั่งซื้ออาจมีการเปลี่ยนแปลงโดยไม่ตั้งใจ
ข้อผิดพลาดในการสร้างมักจะแสดงตัวเองเป็น:
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 หากคุณวางแผนที่จะแจกจ่ายบิลด์ด้วยการออกแบบรหัส