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

标签 java macos url-scheme info.plist

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

最佳答案

看来您的方向是正确的。您的 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 消息。

关于java - 从 OS X 上的 Java 应用程序中的自定义 URI 方案访问参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27435606/

相关文章:

iphone - 将音频从 Mac 上的麦克风流式传输到 iPhone

android - 直接从浏览器(或从应用程序)发送到 whatsapp 组的链接

url - URL 中的方案和协议(protocol)有什么区别?

ios - Facebook SDK : app not registered as a URL Scheme

java - 未为Scanner类型定义nextInt()方法

java - 在Java中调用存储过程

macos - OSX Lion AppleScript : How to get current space # from mission control?

java - 如何从类路径中获取 ResourceBundle 文件?

java - Android 删除应用程序不起作用

macos - OS X 10.5 SDK 已弃用 getAttributeNS;我应该使用什么?