osx – Swift – 获取Mac App在启动时启动

osx – Swift – 获取Mac App在启动时启动,第1张

概述在过去的几个星期里,我一直在迅速编写一个mac应用程序,既可以进入mac编程,也可以在我的工作场所迁移到这个程序中.我正在尝试通过在 BDungan’s blog上提供的代码来修改代码,将我的应用程序添加为“启动启动”应用程序 到目前为止,搞砸了好几个小时后,我想出了以下几点: func itemRefInLoginItems () -> LSSharedFileListItemRef?{ 在过去的几个星期里,我一直在迅速编写一个mac应用程序,既可以进入mac编程,也可以在我的工作场所迁移到这个程序中.我正在尝试通过在 BDungan’s blog上提供的代码来修改代码,将我的应用程序添加为“启动启动”应用程序

到目前为止,搞砸了好几个小时后,我想出了以下几点:

func itemRefInLoginItems () -> LSSharedfileListItemRef?{    var itemRef: LSSharedfileListItemRef? = nil    var itemURL: Unmanaged<CFURLRef>?    let appURL = NSURL.fileURLWithPath(NSBundle.mainBundle().bundlePath)    if let loginItemsRef = LSSharedfileListCreate(kcfAllocatorDefault,kLSSharedfileListSessionLoginItems.takeRetainedValue(),NSMutableDictionary()) {        var unretainedLoginItemsRef = loginItemsRef.takeUnretainedValue()        if var loginItems = LSSharedfileListcopySnapshot(unretainedLoginItemsRef,nil) {            for item in (loginItems.takeRetainedValue() as NSArray) {                let currentItemRef = item as LSSharedfileListItemRef                var outRef: FSRef                if (LSSharedfileListItemResolve(currentItemRef,&itemURL,nil) == noErr) {                    if (appURL?.isEqual(itemURL?.takeRetainedValue()) != nil) { //PROBLEM 1                        itemRef = currentItemRef                    }                }            }        }    }    return itemRef}func isLaunchAtStartup () -> Bool {    let itemRef = self.itemRefInLoginItems()    return itemRef != nil}func makeLaunchAtStartup () { // Compile seems to fall down on this line...    if !self.isLaunchAtStartup() {        let loginItemsRef = LSSharedfileListCreate(kcfAllocatorDefault,NSMutableDictionary())        let appURL = NSURL(fileURLWithPath: NSBundle.mainBundle().bundlePath) as CFURLRef        let itemRef = LSSharedfileListInsertItemURL(loginItemsRef.takeRetainedValue(),kLSSharedfileListItemLast.takeRetainedValue(),nil,appURL,nil)    }}

我遇到两个问题.

问题1

Swift不希望我将NSURL与CFURLRef进行比较,现在我用Xcode的建议,只是为了让应用程序运行,但我100%肯定不会做我认为的事情. (见//问题1).

在目标c中,似乎在NSURL和CFURLRef(或CFURL)之间允许自由桥接,但是试图投射,有条件的转换或任何各种各样的swift,因为(插入正确的角色)接近我的代码不可避免地不会建立.我收到错误,如:

非管理不是NSURL的子类型:
如果appURL为非管理< CFURLRef> == itemURL

等等.

问题2

虽然这个代码当前没有提供任何警告或错误…当尝试编译我得到一个命令失败,由于信号:分段故障:11,这是坦白的…超出了我.

我已经设法得到一个基于Brian Dunagan的Objective C方法的工作实现.
我也碰到你的编译器seg故障问题,但这是由于尝试转换为无效类型引起的;获得正确的类型修复了问题.

我无法获取kLSSharedfileListItemLast以正确返回最后一个文件项引用,因为它总是会导致seg错误.为了解决这个问题,我修改了itemReferencesInLoginItems函数来返回一个元组的引用.

元组中的第一个项目是现有应用程序引用(如果存在),第二个项目是列表的最后一个引用.使用这种方法,我们可以避免不必依赖于kLSSharedfileListItemLast.

这里是代码,随意使用它!我想知道是否有办法让kLSSharedfileListItemLast工作.

func applicationIsInStartUpItems() -> Bool {    return (itemReferencesInLoginItems().existingReference != nil)}func itemReferencesInLoginItems() -> (existingReference: LSSharedfileListItemRef?,lastReference: LSSharedfileListItemRef?) {    var itemUrl : UnsafeMutablePointer<Unmanaged<CFURL>?> = UnsafeMutablePointer<Unmanaged<CFURL>?>.alloc(1)    if let appUrl : NSURL = NSURL.fileURLWithPath(NSBundle.mainBundle().bundlePath) {        let loginItemsRef = LSSharedfileListCreate(            nil,nil        ).takeRetainedValue() as LSSharedfileListRef?        if loginItemsRef != nil {            let loginItems: NSArray = LSSharedfileListcopySnapshot(loginItemsRef,nil).takeRetainedValue() as NSArray            println("There are \(loginItems.count) login items")            let lastItemRef: LSSharedfileListItemRef = loginItems.lastObject as LSSharedfileListItemRef            for var i = 0; i < loginItems.count; ++i {                let currentItemRef: LSSharedfileListItemRef = loginItems.objectAtIndex(i) as LSSharedfileListItemRef                if LSSharedfileListItemResolve(currentItemRef,itemUrl,nil) == noErr {                    if let urlRef: NSURL =  itemUrl.memory?.takeRetainedValue() {                        println("URL Ref: \(urlRef.lastPathComponent)")                        if urlRef.isEqual(appUrl) {                            return (currentItemRef,lastItemRef)                        }                    }                } else {                    println("UnkNown login application")                }            }            //The application was not found in the startup List            return (nil,lastItemRef)        }    }    return (nil,nil)}func toggleLaunchAtStartup() {    let itemReferences = itemReferencesInLoginItems()    let shouldBetoggled = (itemReferences.existingReference == nil)    let loginItemsRef = LSSharedfileListCreate(        nil,nil        ).takeRetainedValue() as LSSharedfileListRef?    if loginItemsRef != nil {        if shouldBetoggled {            if let appUrl : CFURLRef = NSURL.fileURLWithPath(NSBundle.mainBundle().bundlePath) {                LSSharedfileListInsertItemURL(                    loginItemsRef,itemReferences.lastReference,appUrl,nil                )                println("Application was added to login items")            }        } else {            if let itemRef = itemReferences.existingReference {                LSSharedfileListItemRemove(loginItemsRef,itemRef);                println("Application was removed from login items")            }        }    }}
总结

以上是内存溢出为你收集整理的osx – Swift – 获取Mac App在启动时启动全部内容,希望文章能够帮你解决osx – Swift – 获取Mac App在启动时启动所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1041295.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存