我需要编写一个函数,将我的应用程序添加到OS X 10.11上的Startup项目中.这就是我现在所发现的:
func applicationIsInStartUpItems() -> Bool { return (itemReferencesInLoginItems().existingReference != nil) } func itemReferencesInLoginItems() -> (existingReference: LSSharedFileListItemRef?,lastReference: LSSharedFileListItemRef?) { if let appUrl : NSURL = NSURL.fileURLWithPath(NSBundle.mainBundle().bundlePath) { let loginItemsRef = LSSharedFileListCreate(nil,kLSSharedFileListSessionLoginItems.takeRetainedValue(),nil).takeRetainedValue() as LSSharedFileListRef? if loginItemsRef != nil { let loginItems: NSArray = LSSharedFileListCopySnapshot(loginItemsRef,nil).takeRetainedValue() as NSArray if(loginItems.count > 0) { let lastItemRef: LSSharedFileListItemRef = loginItems.lastObject as! LSSharedFileListItemRef for var i = 0; i < loginItems.count; ++i { let currentItemRef: LSSharedFileListItemRef = loginItems.objectAtIndex(i) as! LSSharedFileListItemRef if let itemURL = LSSharedFileListItemCopyResolvedURL(currentItemRef,nil) { if (itemURL.takeRetainedValue() as NSURL).isEqual(appUrl) { return (currentItemRef,lastItemRef) } } } return (nil,lastItemRef) } else { let addatstart: LSSharedFileListItemRef = kLSSharedFileListItemBeforeFirst.takeRetainedValue() return(nil,addatstart) } } } return (nil,nil) } func toggleLaunchAtStartup() { let itemReferences = itemReferencesInLoginItems() let shouldBeToggled = (itemReferences.existingReference == nil) if let loginItemsRef = LSSharedFileListCreate( nil,nil).takeRetainedValue() as LSSharedFileListRef? { if shouldBeToggled { if let appUrl : CFURLRef = NSURL.fileURLWithPath(NSBundle.mainBundle().bundlePath) { LSSharedFileListInsertItemURL(loginItemsRef,itemReferences.lastReference,nil,appUrl,nil) } } else { if let itemRef = itemReferences.existingReference { LSSharedFileListItemRemove(loginItemsRef,itemRef); } } } }
但是OS X 10.11中不推荐使用LSSharedFileListCreate,LSSharedFileListInsertItemURL,LSSharedFileListItemRemove,kLSSharedFileListItemBeforeFirst,LSSharedFileListItemCopyResolvedURL,LSSharedFileListCopySnapshot,kLSSharedFileListSessionLoginItems.如何在最新版本的Mac OS上运行?如何更改或重写此代码?
在Swift 3.0中它看起来像这样:
原文链接:https://www.f2er.com/swift/320261.html在您的主应用程序AppDelegate中:
func applicationDidFinishLaunching(_ aNotification: Notification) { // Check if the launcher app is started var startedAtLogin = false for app in NSWorkspace.shared().runningApplications { if app.bundleIdentifier == NCConstants.launcherApplicationIdentifier { startedAtLogin = true } } // If the app's started,post to the notification center to kill the launcher app if startedAtLogin { DistributedNotificationCenter.default().postNotificationName(NCConstants.KILLME,object: Bundle.main.bundleIdentifier,userInfo: nil,options: DistributedNotificationCenter.Options.deliverImmediately) } }
在Launcher应用程序AppDelegate中:
func applicationDidFinishLaunching(_ aNotification: Notification) { let mainAppIdentifier = "<main-app-bundle-id>" let running = NSWorkspace.shared().runningApplications var alreadyRunning = false // loop through running apps - check if the Main application is running for app in running { if app.bundleIdentifier == mainAppIdentifier { alreadyRunning = true break } } if !alreadyRunning { // Register for the notification killme DistributedNotificationCenter.default().addObserver(self,selector: #selector(self.terminate),name: NCConstants.KILLME,object: mainAppIdentifier) // Get the path of the current app and navigate through them to find the Main Application let path = Bundle.main.bundlePath as NSString var components = path.pathComponents components.removeLast(3) components.append("MacOS") components.append("<your-app-name>") let newPath = NSString.path(withComponents: components) // Launch the Main application NSWorkspace.shared().launchApplication(newPath) } else { // Main application is already running self.terminate() } } func terminate() { print("Terminate application") NSApp.terminate(nil) }
最后,在主应用程序中,我添加了一个带有切换按钮的用户界面.用户可以选择是否在登录时启动应用程序.该选项存储在UserDefaults中.
在视图控制器中:
@IBAction func toggleLaunchAtLogin(_ sender: Any) { if toggleOpenAppLogin.selectedSegment == 0 { if !SMLoginItemSetEnabled(NCConstants.launcherApplicationIdentifier as CFString,true) { print("The login item was not successfull") toggleOpenAppLogin.setSelected(true,forSegment: 1) } else { UserDefaults.standard.set("true",forKey: "appLoginStart") } } else { if !SMLoginItemSetEnabled(NCConstants.launcherApplicationIdentifier as CFString,false) { print("The login item was not successfull") toggleOpenAppLogin.setSelected(true,forSegment: 0) } else { UserDefaults.standard.set("false",forKey: "appLoginStart") } } }
我希望这可以帮助别人.