我想在我的应用中构建URI(或URL方案)支持。
我在LSSetDefaultHandlerForURLScheme()
中执行了+ (void)initialize
,我也在我的info.plist
中设置了特定的网址方案。所以我的网址方案没有Apple Script
或Apple Events
。
当我在我最喜欢的浏览器中拨打myScheme:
时,系统会激活我的应用。
问题是,如何在调用方案时处理这些方案。或者更好地说:当调用myScheme:
时,如何定义我的应用应该做什么。
我必须实施一种特殊的方法,还是必须在某处注册?
答案 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)")
}
}