In meiner App soll es möglich sein, diese zum Autostart hinzuzufügen oder entfernen zu können - damit die App startet, wenn das OS hochfährt (bzw. auch nicht). Folgender Code funktioniert problemlos - genau so lange, bis ich die Sandbox aktiviere. Auf meiner Suche nach einer Lösung bin ich häufig auf die Notwendigkeit einer "Helper App" gestoßen - kann mir aber einfach nicht vorstellen, dass es nicht auch einfacher geht?
Alles anzeigen
Quellcode
-
- 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,
- kLSSharedFileListSessionLoginItems.takeRetainedValue(),
- nil
- ).takeRetainedValue() as LSSharedFileListRef?
- if loginItemsRef != nil {
- let loginItems: NSArray = LSSharedFileListCopySnapshot(loginItemsRef, nil).takeRetainedValue() as NSArray
- println("There are \(loginItems.count) login items")
- 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 LSSharedFileListItemResolve(currentItemRef, 0, 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 App")
- }
- }
- println("App was not found in startup items")
- return (nil, lastItemRef)
- } else {
- let addatstart: LSSharedFileListItemRef = kLSSharedFileListItemBeforeFirst.takeRetainedValue()
- return(nil,addatstart)
- }
- }
- }
- return (nil, nil)
- }
- func toggleLaunchAtStartup() -> Bool {
- var autoStartState : Bool = false
- let itemReferences = itemReferencesInLoginItems()
- let shouldBeToggled = (itemReferences.existingReference == nil)
- let loginItemsRef = LSSharedFileListCreate(
- nil,
- kLSSharedFileListSessionLoginItems.takeRetainedValue(),
- nil
- ).takeRetainedValue() as LSSharedFileListRef?
- if loginItemsRef != nil {
- if shouldBeToggled {
- if let appUrl : CFURLRef = NSURL.fileURLWithPath(NSBundle.mainBundle().bundlePath) {
- LSSharedFileListInsertItemURL(
- loginItemsRef,
- itemReferences.lastReference,
- nil,
- nil,
- appUrl,
- nil,
- nil
- )
- println("App was added to login items")
- autoStartState = true
- }
- } else {
- if let itemRef = itemReferences.existingReference {
- LSSharedFileListItemRemove(loginItemsRef,itemRef);
- println("App was removed from login items")
- autoStartState = false
- }
- }
- }
- return autoStartState
- }