
到目前为止,搞砸了好几个小时后,我想出了以下几点:
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在启动时启动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)