我已经在 OS X 上的 info.plist 中成功添加了自定义 URI 方案,因此只要用户在浏览器中输入“myApp:SomeParameter”,我的基于 Java 1.7 的应用程序(用 Netbeans 编写)就会启动:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>My App</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myApp</string>
</array>
</dict>
</array>
如果安装在 Windows 机器上,我还成功地为应用程序添加了相应的注册表项。问题是,在 Windows 平台上,我可以轻松地传递参数(在上述情况下,我希望输入的 uri“myApp:SomeParameter”中的“SomeParameter”)。它只是作为常规参数传递给应用程序主要方法,但在 OS X 上不是这种情况。我做了一些研究并尝试了 this solution但它需要一些 Cocoa 库,并且在 Windows 上编译和运行时会导致问题。
编辑:我试图找到一个包含 com.apple.eawt.Application.setOpenURIHandler() 的 AppleJavaExtensions 版本,但我只找到了 1.4 版,其中缺少它。知道为什么吗?
是否有另一种方法可以将参数从自定义 URI 方案传递到在 Mac/OS X 上运行的跨平台 Java 应用程序?
编辑 2: 请参阅下面接受的答案,但作为旁注:我们成功地尝试了使用 AppleScript 作为中间层的可能解决方法。 this article中的脚本可以简化为接收带参数的完整 URL,然后使用查询字符串作为普通命令行参数调用基于 Java 的应用程序。
最佳答案
看来您的方向是正确的。您的 Info.plist
看起来是正确的。您不需要创建任何自定义的原生 Cocoa 代码,只需使用 setOpenURIHandler()
。例如:
public class AppleMenus implements com.apple.eawt.OpenURIHandler {
private MyApp myApp;
public AppleMenus(MyApp myApp) {
this.myApp = myApp;
final com.apple.eawt.Application app = com.apple.eawt.Application.getApplication();
app.setOpenURIHandler(this);
}
@Override
public void openURI(final com.apple.eawt.AppEvent.OpenURIEvent oue) {
myApp.openCustomURL(oue.getURI());
}
}
您需要 AppleJavaExtensions 的唯一原因是您尝试在非 Apple 环境(例如 Windows)上编译此代码。 Windows 不知道 OpenURIHandler
是什么,因此您会在那里遇到编译错误。 AppleJavaExtensions 只是提供了必要的 API 而没有实现,只是为了能够在这些其他环境中进行编译。
这是官方最新(也可能是最后)版本:https://developer.apple.com/legacy/library/samplecode/AppleJavaExtensions/Introduction/Intro.html
请注意,您的 URI 处理程序将在当前运行的应用程序实例中被调用,或者将首先创建您的应用程序的新实例然后被调用。 OpenURIEvent
将包含您发送的整个 URI 消息。
关于java - 从 OS X 上的 Java 应用程序中的自定义 URI 方案访问参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27435606/