如何处理默认的URLscheme
我想在我的应用程序中构buildURI(或URLscheme)支持。
我在我的+ (void)initialize
做了一个LSSetDefaultHandlerForURLScheme()
,并且在我的info.plist
也设置了特定的URLscheme。 所以我有没有Apple Script
或Apple 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脚本指南使用这个任务作为安装事件处理程序的例子 。
所有学分应该去weichsel和kch
我只是为了方便添加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 { … }