26

アプリで URI (または URL スキーム) のサポートを構築したいと考えています。

私は自分LSSetDefaultHandlerForURLScheme()で実行し+ (void)initialize、特定の URL スキームを自分の にも設定しましたinfo.plistApple Scriptしたがって、 またはのない URL スキームがありますApple Events

myScheme:お気に入りのブラウザーで呼び出すと、システムがアプリをアクティブにします。

問題は、呼び出されたときにスキームを処理する方法です。myScheme:あるいは、が呼び出されたときにアプリが何をすべきかを定義するにはどうすればよいでしょうか。

実装する必要がある特別な方法はありますか、またはどこかに登録する必要がありますか?

4

5 に答える 5

76

AppleScript について言及しているように、Mac OS X で作業していると思います。

カスタム URL スキームを登録して使用する簡単な方法は、.plist でスキームを定義することです。

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>URLHandlerTestApp</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>urlHandlerTestApp</string>
        </array>
    </dict>
</array>

スキームを登録するには、これを AppDelegate の初期化に入れます。

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

アプリケーションが URL スキームを介してアクティブ化されるたびに、定義されたセレクターが呼び出されます。

URL 文字列を取得する方法を示す、イベント処理メソッドのスタブ:

- (void)handleURLEvent:(NSAppleEventDescriptor*)event
        withReplyEvent:(NSAppleEventDescriptor*)replyEvent
{
    NSString* url = [[event paramDescriptorForKeyword:keyDirectObject]
                        stringValue];
    NSLog(@"%@", url);
}

Apple のドキュメント: Get URL Handler のインストール

更新 にイベント ハンドラーをインストールするサンドボックス化されたアプリの問題に気付きましたapplicationDidFinishLaunching:。サンドボックスを有効にすると、カスタム スキームを使用する URL をクリックしてアプリを起動したときに、ハンドラー メソッドが呼び出されません。ハンドラーを少し前にインストールすることapplicationWillFinishLaunching:で、メソッドは期待どおりに呼び出されます。

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

- (void)handleURLEvent:(NSAppleEventDescriptor*)event
        withReplyEvent:(NSAppleEventDescriptor*)replyEvent
{
    NSString* url = [[event paramDescriptorForKeyword:keyDirectObject]
                        stringValue];
    NSLog(@"%@", url);
}

iPhone で URL スキームのアクティベーションを処理する最も簡単な方法は、UIApplicationDelegate のapplication:handleOpenURL:-ドキュメンテーションを実装することです。

于 2010-01-02T10:15:22.990 に答える
6

問題は、呼び出されたときにスキームを処理する方法です。

そこで、Apple イベントの出番です。Launch Services がアプリに URL を開くように要求すると、アプリにkInternetEventClass/kAEGetURLイベントが送信されます。

Cocoa Scripting Guideでは、まさにこのタスクをイベント ハンドラのインストール例として使用しています。

于 2010-01-02T10:16:07.967 に答える
0

スクリプト用語 SDEF で「get URL」コマンドを定義し、対応するメソッドを実装できます。たとえば、ターミナルの SDEF には、URL を処理するための次のコマンド定義が含まれています。

<command name="get URL" code="GURLGURL" description="Open a command an ssh, telnet, or x-man-page URL." hidden="yes">
    <direct-parameter type="text" description="The URL to open." />
</command>

アプリケーションがそれに応答することを宣言します。

<class name="application" code="capp" description="The application's top-level scripting object.">
    <cocoa class="TTApplication"/>
    <responds-to command="get URL">
        <cocoa method="handleGetURLScriptCommand:" />
    </responds-to>
</class>

TTApplication クラス (NSApplication のサブクラス) は、メソッドを定義します。

- (void)handleGetURLScriptCommand:(NSScriptCommand *)command { … }
于 2013-12-03T06:44:52.717 に答える