我已经在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平台上我可以轻松传递参数(在上面的例子中我想要&#34; SomeParameter&#34;来自输入的uri&#34; myApp:SomeParameter&#34;)。它只是作为常规参数传递给应用程序main方法,但在OS X上并非如此。我做了一些研究并尝试了this solution但它需要一些Cocoa库并在编译和运行时导致问题视窗。
编辑:我试图追踪包含com.apple.eawt.Application.setOpenURIHandler()的AppleJavaExtensions版本,但我只找到版本1.4,其中&#39失踪了。知道为什么吗?
是否有另一种方法可以将参数从自定义URI方案传递到在Mac / OS X上运行的跨平台Java应用程序?
编辑2:请参阅下面接受的答案,但作为旁注:我们成功地尝试了使用AppleScript作为中间层的可能解决方法。可以简化this article中的脚本以接收带参数的完整URL,然后使用查询字符串作为常规命令行参数调用基于Java的应用程序。
答案 0 :(得分:1)
看起来你走在正确的轨道上。您的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消息。
答案 1 :(得分:0)
以下内容(适用于Java 9)将在跨平台(Windows和macOS已通过测试)下工作:
import java.awt.*;
import java.awt.desktop.OpenURIEvent;
import java.awt.desktop.OpenURIHandler;
import java.net.URI;
import java.net.URISyntaxException;
public class UriLaunchedApp {
public static void main(String[] args) throws URISyntaxException {
try {
Desktop.getDesktop().setOpenURIHandler(new OpenURIHandler() {
@Override
public void openURI(OpenURIEvent e) {
System.out.println("We are maybe on macOS...");
processUri(e.getURI());
}
});
} catch (UnsupportedOperationException e) {
System.out.println("We are maybe on Windows...");
processUri(new URI(args[0]));
}
}
private static void processUri(URI uri) {
System.out.println("Do something with " + uri);
}
}