从 OS X 上的 Java 应用程序中的自定义 URI 方案访问参数



我已经成功地在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-。

最新更新