在OS X 10.11上启动Swift Cocoa应用程序

在OS X 10.11上启动Swift Cocoa应用程序,第1张

概述我需要编写一个函数,将我的应用程序添加到OS X 10.11上的Startup项目中.这就是我现在所发现的: func applicationIsInStartUpItems() -> Bool { return (itemReferencesInLoginItems().existingReference != nil)}func itemReferencesInLoginItem 我需要编写一个函数,将我的应用程序添加到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中它看起来像这样:

在您的主应用程序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应用程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存