我已经成功地在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"(。它只是作为常规参数传递给应用程序 main 方法,但在 OS X 上并非如此。我已经做了一些研究并尝试了这个解决方案,但它需要一些 Cocoa 库,并且在 Windows 上编译和运行时会导致问题。
编辑:我试图追踪包含com.apple.eawt.Application.setOpenURIHandler((的AppleJavaExtensions版本,但我只找到了缺少1.4的版本。知道为什么吗?
有没有另一种方法可以将参数从自定义 URI 方案传递到在 Mac/OS X 上运行的跨平台 Java 应用程序?
编辑2:请参阅下面的已接受答案,但作为旁注:我们成功地尝试了使用AppleScript作为中间层的可能解决方法。可以简化本文中的脚本,以接收带有参数的完整 URL,然后使用查询字符串作为普通命令行参数调用基于 Java 的应用程序。
看起来你走在正确的轨道上。 您的Info.plist
看起来正确。 您无需创建任何自定义本机可可代码,只需使用 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 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);
}
}
见太 https://docs.oracle.com/javase/9/docs/api/java/awt/Desktop.html#setOpenURIHandler-java.awt.desktop.OpenURIHandler-。