2014-06-06 14 views
5

Ich habe versucht, die übliche Art, dies in Objective-c in swift für eine neue schnelle App zu replizieren, mit der ich herumspiele.Wie erfassen Sie die URL, die zum Starten einer OSX-Anwendung über URLScheme in Swift verwendet wird?

Wie dies in Objective-c zu tun, ist gut dokumentiert, erhalten Sie den freigegebenen Apple-Event-Manager und setEventHandler Methode aufrufen, eine Funktion als Handler für die Ereignisklasse mit dem Ereignis-ID kAEGetURL zu registrieren.

So in swift Ich versuche, das gleiche mit diesem Code zu tun hinzugefügt, um die Vorlage AppDelegate.swift in einem brandneuen Projekt:

func applicationWillFinishLaunching(aNotification: NSNotification?) { 
    var appleEventManager:NSAppleEventManager = NSAppleEventManager.sharedAppleEventManager() 
    appleEventManager.setEventHandler(self, andSelector: "handleGetURLEvent:withReplyEvent:", forEventClass: kInternetEventClass, andEventID: kAEGetURL) 

} 

func handleGetURLEvent(event: NSAppleEventDescriptor?, replyEvent: NSAppleEventDescriptor?) { 
    println("yay"); 
} 

Soweit ich das sagen kann, ist nur eine Syntax Umwandlung des Standard-Objective-c-Aufrufs. Aber ich bekomme einen Typfehler sowohl für die forEventClass und andEventId Argumente an die setEventHandler Methode:

'NSNumber' is not a subtype of 'AEEventClass' für das forEventClass Argument

und:

'NSNumber' is not a subtype of 'AEEventId' für das andEventID Argument

Ich bin nicht Sicher, was ich in diesem Stadium falsch mache, da sowohl als auch kAEGetURL Konstanten sind, die von Apple definiert sind ... Sicherlich bin ich nicht verpflichtet, ihrezu konvertierenTyp zu den jeweils benötigten Typen? Und wenn ich bin, kann ich nicht herausfinden, wie.

Antwort

13

Soweit ich aus der Dokumentation der Klassen sagen kann, nimmt die Konstante und wandelt sie in den richtigen Typ:

func applicationWillFinishLaunching(aNotification: NSNotification?) { 
    var appleEventManager:NSAppleEventManager = NSAppleEventManager.sharedAppleEventManager() 
    appleEventManager.setEventHandler(self, andSelector: "handleGetURLEvent:withReplyEvent:", forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL)) 

} 
+0

Wenn jemand wirklich weiß, was hier passiert und was die richtige Terminologie ist, bitte meine Antwort bearbeiten. Vielen Dank! – MagerValp

+0

Ja danke, das scheint zu funktionieren - fühlt sich komisch an, dass das aber nötig ist. –

+1

Erwähnenswert ist, dass Ihre Selektorzeichenfolge "handleGetURLEvent: replyEvent:" lauten sollte, damit die obige Swift-Func-Deklaration korrekt übereinstimmt. –

1

ich, dass ab Xcode 8.2 fand ich brauchte MagerValp den Code wie folgt zu konvertieren:

func applicationWillFinishLaunching(_ notification: Notification) { 
    let aem = NSAppleEventManager.shared(); 
    aem.setEventHandler(self, andSelector: Selector(("handleGetURLEvent:withReplyEvent:")), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL)) 
} 

Hoffe das hilft.

+0

Ich erhalte einen Fehler in der console.app, wenn ich versuche, meine App über die benutzerdefinierte URL zu öffnen: '- [MyApp.AppDelegate handleGetURLEvent: withReplyEvent:]: unerkannter Selektor an Instanz 0x60c0000039b0' gesendet (Ich habe den zweiten Parameter in handleGetURLEvent benannt 'withReplyEvent'). Irgendeine Idee? Mit Xcode 8.3.3 (8E3004b) – wetjosh

+0

Die Lösung, die auf meine Frage hier https://stackoverflow.com/questions/46065842/open-cocoa-app-via-url-scheme gegeben wurde, ist zu ersetzen 'Selector (("handleGetURLEvent: withReplyEvent:")) 'mit dem neuen Stilselektor:' #selector (AppDelegate.handleGetURLEvent (event: replyEvent :)) ' – wetjosh

Verwandte Themen