2017-09-06 6 views
0

私の質問はthis questionと同じですが、しばらくの間更新されておらず、回答が更新されるように依頼されてからSwiftが大きく変更されました。私がしたいのは、私のココアアプリを開くために使われたURLをキャプチャするだけですが、コードはハンドラ関数で決して実行されません。カスタムURLスキームでアプリケーションを起動すると、Console.appにエラーがスローされます。ここでのエラーは、次のとおりです。URL Schemeを使用してOpen Cocoa App

-[MyApp.AppDelegate handleGetURLEvent:replyEvent:]: unrecognized selector sent to instance 0x60c0000039b0 
-[MyApp.AppDelegate handleGetURLEvent:replyEvent:]: unrecognized selector sent to instance 0x60c0000039b0 
    OSErr AERemoveEventHandler(AEEventClass, AEEventID, AEEventHandlerUPP, Boolean)(spec,phac handler=0x7fff576b7f15 isSys=YES) err=0/noErr 
-[MyApp.AppDelegate handleGetURLEvent:replyEvent:]: unrecognized selector sent to instance 0x60c0000039b0 
-[MyApp.AppDelegate handleGetURLEvent:replyEvent:]: unrecognized selector sent to instance 0x60c0000039b0 
    OSErr AERemoveEventHandler(AEEventClass, AEEventID, AEEventHandlerUPP, Boolean)(GURL,GURL handler=0x7fff5661d680 isSys=YES) err=0/noErr 
LSExceptions shared instance invalidated for timeout. 

そして、私の裸の骨アプリ:

MyAppという名前の新しいココアアプリを作成します。 Info> URL Typesで、Identifierフィールドに自分のアプリケーションのバンドルIDを入力し、URL Schemesフィールドにblueなどを入力します。ビルド

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

func handleGetURLEvent(event: NSAppleEventDescriptor?, replyEvent: NSAppleEventDescriptor?) { 
    NSLog("heyo!") 
} 

と私のアプリを実行します。AppDelegateクラスに次の2つの関数を追加します。終了し、アドレスバーにSafariタイプblue://whateverを入力し、returnキーを押します。アプリケーションが開きますが、NSLogはConsole.appに表示されず、代わりに上記のエラーが表示されます。私はURLを解析する方法に執着することが大好きですが、私はまだその部分に到達することはできません。私はXcode 8.3.3(8E3004b)とSwift 3.1を実行しています。あなたは私と同じ結果を得ていますか?ハンドラ関数を間違って呼び出していますか?

答えて

2

Selector(("handleGetURLEvent:replyEvent:"))#selector(AppDelegate.handleGetURLEvent(event:replyEvent:))と交換してください。 #selectorマクロは、実行時に正しいセレクタを使用する必要があるように、コンパイル時にメソッドの存在を確認します。余談

-[MyApp.AppDelegate handleGetURLEvent:replyEvent:]: unrecognized selector sent to instance 0x60c0000039b0 

として

handleGetURLEvent:replyEvent:がAppDelegateに呼び出されたことを言っているが、それは、セレクタのいずれかが誤って綴られたか、それは間違ったオブジェクトに送られたことを意味し、このメッセージに応答しません。この場合、Selector()の構文がObj-Cなので、間違って入力されている可能性があります。そのため、同等のものがSwiftに含まれているかどうかを知ることは難しくなります。このため、#selectorを使用する必要があります。

+0

をあなたは正しい罰金先生です!私は、私が参照した質問にあなたの解答にコメントを残します。ありがとう、トン! – wetjosh

0

@Lucas Derraughは天才です - 私はその解決策を全面的に見ました。ありがとう!スウィフト4 Xcodeの上

一つ追加機能に@objcを追加するために私を促したので、私は持っていた:

func applicationDidFinishLaunching(_ aNotification: Notification) { 
     // Register for Call back URL events 
     let aem = NSAppleEventManager.shared(); 
     aem.setEventHandler(self, andSelector: #selector(AppDelegate.handleGetURLEvent(event:replyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL)) 

    } 

    @objc func handleGetURLEvent(event: NSAppleEventDescriptor, replyEvent: NSAppleEventDescriptor) { 

    let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue! 
     let url = URL(string: urlString!)! 
     // DO what you will you now have a url.. 

    } 
関連する問題