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

时间:2014-12-12 01:50:43

标签: java macos info.plist uri-scheme

我已经在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的应用程序。

2 个答案:

答案 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);
    }
}

也见https://docs.oracle.com/javase/9/docs/api/java/awt/Desktop.html#setOpenURIHandler-java.awt.desktop.OpenURIHandler-