14

これは、この質問の 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 を確実にキャプチャする方法を知っている人はいますか?

4

2 に答える 2

2

私はちょうどこの正確な問題に直面しました。それが適切な解決策かどうかはわかりませんが、init代わりにアプリデリゲートのメソッドにイベントハンドラーを登録できます。

// in AppDelegate.m

- (id)init
{
  self = [super init];

  if (self) {
    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
  }

  return self;
}

ただし、アプリが URL スキームによって開始された場合は、 handleURLEvent:withReplyEventget が前に 呼び出されることに注意してください。applicationDidFinishLaunching:

于 2013-07-10T07:49:54.533 に答える