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中它看起来像这样:在您的主应用程序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") } }}
我希望这可以帮助别人.
总结以上是内存溢出为你收集整理的在OS X 10.11上启动Swift Cocoa应用程序全部内容,希望文章能够帮你解决在OS X 10.11上启动Swift Cocoa应用程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)