如何使用默认URL方案处理

时间:2010-01-02 09:20:47

标签: macos cocoa url-scheme appkit

我想在我的应用中构建URI(或URL方案)支持。

我在LSSetDefaultHandlerForURLScheme()中执行了+ (void)initialize,我也在我的info.plist中设置了特定的网址方案。所以我的网址方案没有Apple ScriptApple Events

当我在我最喜欢的浏览器中拨打myScheme:时,系统会激活我的应用。

问题是,如何在调用方案时处理这些方案。或者更好地说:当调用myScheme:时,如何定义我的应用应该做什么。

我必须实施一种特殊的方法,还是必须在某处注册?

5 个答案:

答案 0 :(得分:69)

正如您提到的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的文档:Installing a 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: - Documentation

答案 1 :(得分:7)

所有学分应归 weichsel kch

我只是为了您的方便而添加swift(2.2 / 3.0)代码

A=10 B=20

答案 2 :(得分:5)

  

问题是,如何在调用方案时处理这些方案。

这就是Apple Events的用武之地。当Launch Services希望您的应用打开网址时,它会向您的应用发送kInternetEventClass / kAEGetURL个活动。

The Cocoa Scripting Guide使用this very task as an example of installing an event handler

答案 3 :(得分: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 { … }

答案 4 :(得分:0)

我只是添加稍微不同的Swift 4/5版本的代码:

func applicationWillFinishLaunching(_ notification: Notification) {
    NSAppleEventManager
        .shared()
        .setEventHandler(
            self,
            andSelector: #selector(handleURL(event:reply:)),
            forEventClass: AEEventClass(kInternetEventClass),
            andEventID: AEEventID(kAEGetURL)
        )

}

@objc func handleURL(event: NSAppleEventDescriptor, reply: NSAppleEventDescriptor) {
    if let path = event.paramDescriptor(forKeyword: keyDirectObject)?.stringValue?.removingPercentEncoding {
        NSLog("Opened URL: \(path)")
    }
}