5

OSX ブラウザーでカスタム URL から起動されるアプリを作成しました。これは、標準の CFBundleURLName エントリをアプリの plist に追加することで問題なく機能しました。

私のアプリケーションは、カスタム URL のいくつかのパラメーターを解析して読み取り、それらに反応することで機能します。

たとえば、次のカスタム URL を使用します。

foobar://param1/param2/param3

ブラウザで上記の URL をクリックすると、OSX がアプリを起動し、実際のカスタム URL 自体を最初の引数としてアプリに渡します。したがって、アプリでは、最初の引数を読み取り、アプリを開いた URL を取得し、必要なパラメーターを解析することができます。

これは OSX 10.5-10.8 では問題なく動作しますが、10.9 Mavericks では動作が少し異なるようです。つまり、アプリケーションがまだ実行されていない場合でも、アプリを起動しますが、最初の引数としてカスタム URL を渡しません。そのため、アプリは、直接ではなく、ユーザーによって手動で起動されたと見なします (ランチパッドから選択するなど)。ブラウザ。

奇妙なことに、アプリケーションが既に開いている場合、カスタム URL をクリックすると、最初の引数として URL 文字列がアプリに送信され、アプリ内の機能が期待どおりに実行されます。

アプリの新旧バージョンを使用して 10.6->10.9 でこれをテストしたところ、すべて同じ動作を示しました。10.9 Mavericks より前のバージョンでの最初の起動ではすべて正常に動作しますが、10.9 では、最初の引数として渡された URL を取得せず、実行中の 2 回目のクリックで動作します。

誰かがこれに光を当てることができれば、私はとても感謝しています.

4

1 に答える 1

1

URL ハンドラーをどこに設定しますか? それは早期に起こる必要があります。現在 にある場合はapplicationDidFinishLaunching、 に移動してみてくださいapplicationWillFinishLaunching

たとえば、SafariでURLを開く前にアプリが実行されていない場合でも、次のように機能し、起動時にURLをログに記録します。WillFinishLaunching を DidFinishLaunching に変更すると、あなたが説明した動作が正確に表示されます。

@implementation AppDelegate

- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
    [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}

- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
    NSAppleEventDescriptor *obj = [event descriptorForKeyword:keyDirectObject];
    DescType type = [obj descriptorType];
    if (type == typeChar) {
        NSData *data = [obj data];
        if (data) {
            NSString *urlString = [[NSString  alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSURL *url = [NSURL URLWithString:urlString];
            NSLog(@"url: %@", url);
        }
    }
}

@end
于 2013-12-10T23:54:16.940 に答える