В течение последних нескольких недель я пишу приложение для Mac в быстром режиме, как для программирования на Mac, так и для быстрой работы, когда мы переходим к нему на моем рабочем месте. В настоящее время я пытаюсь получить код для добавления моего приложения в качестве приложения "Запуск при запуске", пошив код, любезно предоставленный на BDungan 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, 0, &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, kLSSharedFileListSessionLoginItems.takeRetainedValue(), NSMutableDictionary())
let appURL = NSURL(fileURLWithPath: NSBundle.mainBundle().bundlePath) as CFURLRef
let itemRef = LSSharedFileListInsertItemURL(loginItemsRef.takeRetainedValue(), kLSSharedFileListItemLast.takeRetainedValue(), nil, nil, appURL, nil, nil)
}
}
Я столкнулся с двумя проблемами.
Проблема 1
Swift не хочет, чтобы я сравнивал NSURL с CFURLRef... теперь я пошел с предложением Xcode только для того, чтобы запустить приложение, но я на 100% уверен, что он не делает то, что я думаю, это, (см.//ПРОБЛЕМА 1).
В objective-c кажется, что между NSURL и CFURLRef (или CFURL) разрешено использовать бесплатный мост, однако при попытке выполнить бросок, условный листинг или любое другое быстрое, как (вставить правильный символ здесь) приближается к моему коду, неизбежно не будет строить. Я получаю такие ошибки, как:
Неуправляемый не является подтипом NSURL:
if appURL as Unmanaged<CFURLRef> == itemURL
e.t.c.
Проблема 2
Хотя этот код в настоящее время не дает никаких предупреждений или ошибок... при попытке скомпилировать, я получаю Command failed due to signal: Segmentation fault: 11
, который, если быть откровенным... находится вне меня.