如何处理默认的URLscheme

我想在我的应用程序中构buildURI(或URLscheme)支持。

我在我的+ (void)initialize做了一个LSSetDefaultHandlerForURLScheme() ,并且在我的info.plist也设置了特定的URLscheme。 所以我有没有Apple ScriptApple Events URLscheme。

当我打电话myScheme:在我最喜欢的浏览器系统激活我的应用程序。

问题是,如何在被调用时处理这些scheme。 或者更好的说:当myScheme:被调用时,我怎样才能定义我的应用程序应该做什么。

是否有一个特殊的方法,我必须执行或我必须注册一个地方?

正如你提到的AppleScript,我想你正在使用Mac OS X.

注册和使用自定义URLscheme的简单方法是在.plist中定义scheme:

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

要注册该scheme,把这个在您的AppDelegate的初始化:

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

每当你的应用程序通过URLscheme激活,定义的select器被调用。

事件处理方法的存根,显示如何获取URLstring:

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

Apple的文档: 安装Get URL处理程序

更新我只注意到在applicationDidFinishLaunching:中安装事件处理程序的沙盒应用程序的问题applicationDidFinishLaunching: 。 启用沙箱后,处理程序方法不会在应用程序启动时通过单击使用自定义scheme的URL来调用。 通过在applicationWillFinishLaunching:稍微安装处理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上,处理URLscheme激活的最简单的方法是实现UIApplicationDelegate的application:handleOpenURL: – 文档

问题是,如何在被调用时处理这些scheme。

这就是苹果事件进来的地方。当启动服务希望你的应用程序打开一个URL时,它会向你的应用程序发送一个kInternetEventClass / kAEGetURL事件。

Cocoa脚本指南使用这个任务作为安装事件处理程序的例子 。

所有学分应该去weichselkch

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

 func applicationWillFinishLaunching(_ notification: Notification) { NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(self.handleGetURL(event:reply:)), forEventClass: UInt32(kInternetEventClass), andEventID: UInt32(kAEGetURL) ) } func handleGetURL(event: NSAppleEventDescriptor, reply:NSAppleEventDescriptor) { if let urlString = event.paramDescriptor(forKeyword: keyDirectObject)?.stringValue { print("got urlString \(urlString)") } } 

您可以在脚本术语SDEF中定义“get URL”命令并实现相应的方法。 例如,terminal的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 { … }