これは、この質問の Cocoa バージョンです。
起動時に AEInstallEventHandler ハンドラが呼び出されない
これが私の Info.plist プロトコル登録です。
...
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>My Protocol</string>
<key>CFBundleURLIconFile</key>
<string>myicon</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
ここでは、「myapp://unused/?a=123&b=456」というリンクでブラウザ リンクがクリックされたときに、kInternetEventClass/kAEGetURL イベントをリッスンするメソッドを設定します。
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
[[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getURL:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
...
}
ハンドラー メソッドは次のとおりです。
- (void)getURL:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)reply
{
[[[event paramDescriptorForKeyword:keyDirectObject] stringValue] writeToFile:@"/testbed/complete_url.txt" atomically:YES];
}
テスト Web リンクは次のとおりです。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
</head>
<body>
<a href="myapp://open/?a=123&b=456">Open My App</a>
</body>
</html>
アプリケーションがすでに実行されている場合、これはすべてうまく機能します。
ハンドラー メソッドが呼び出され、完全な URL が取得されます。
ただし、アプリがまだ実行されていない場合、同じリンクでアプリが起動されますが、ハンドラーは呼び出されません。ハンドラーがまだイベントにバインドされていないため、これは理にかなっています。
URL のこれらの引数は、アプリケーションが webapp と連携するために重要です。ほとんどの場合、このクリックが発生した時点でアプリケーションはすでに実行されていますが、場合によっては実行されないことも予想できます。
環境とプロセスの呼び出し引数を調べてみましたが、どちらにも URL が表示されません。
ブラウザのクリックが発生したときにアプリケーションがまだ実行されていない場合でも、この URL を確実にキャプチャする方法を知っている人はいますか?