这是这个问题的 Cocoa 版本:
启动时未调用 AEInstallEventHandler 处理程序
这是我的 Info.plist 协议注册:
...
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>My Protocol</string>
<key>CFBundleURLIconFile</key>
<string>myicon</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
在这里,我设置方法以在使用链接“myapp://unused/?a=123&b=456”单击浏览器链接时侦听 kInternetEventClass/kAEGetURL 事件:
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
[[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getURL:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
...
}
这是处理程序方法:
- (void)getURL:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)reply
{
[[[event paramDescriptorForKeyword:keyDirectObject] stringValue] writeToFile:@"/testbed/complete_url.txt" atomically:YES];
}
这是测试网络链接:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
</head>
<body>
<a href="myapp://open/?a=123&b=456">Open My App</a>
</body>
</html>
如果应用程序已经在运行,这一切都很好。
调用处理程序方法并捕获完整的 url。
但是,如果应用程序尚未运行,则相同的链接将启动应用程序,但不会调用处理程序——这是有道理的,因为处理程序尚未绑定到事件。
URL 中的这些参数对于我们的应用程序与 webapp 协调很重要。尽管大多数情况下我们的应用程序在单击发生时已经在运行,但可以合理地预期在某些情况下它不会。
我已尝试检查环境和进程调用参数,但在其中任何一个中都看不到 URL。
任何人都知道我们如何可靠地捕获此 URL,即使在发生浏览器点击时我们的应用程序尚未运行?