【问题标题】:Access parameters from custom URI scheme in Java application on OS X在 OS X 上的 Java 应用程序中从自定义 URI 方案访问参数
【发布时间】:2015-02-10 16:33:18
【问题描述】:

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

【问题讨论】:

  • 作为一个附带问题,这是否成功接收初始启动链接参数?我已经完成了这项工作,但是在应用加载后没有收到第一个链接的数据,只是任何后续点击。

标签: java macos url-scheme info.plist


【解决方案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 消息。

【讨论】:

  • 好吧,你会看那个! AppleJavaExtensions.jar 隐藏在那里(我从未点击过“下载示例代码”,因为我没想到会是这样)。很少有人比我更高兴被证明是一个彻头彻尾的白痴。感谢您清理 jar 的用途,因为我正在 Windows 上编译。
【解决方案2】:

以下(适用于 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-

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多