我可以为 JavaFX 应用程序创建自己的本机启动器吗?

Can I create my own native launcher for a JavaFX app?

我们开发了一个 JavaFX 应用程序,我们计划将其提交到 Mac App Store,但在当天很晚的时候才发现它的当前形式 — 因为它有 functionality/usage 与在我们网站上支付的订阅有关的限制——它可能会因为通过应用内购买以外的机制提供这些附加功能而被拒绝(Review Guidelines 第 7.1、7.13 和 7.15 节)。

我们想通过在我们的 JavaFX 应用中添加应用内购买来解决这个问题!

我想到的第一个解决方案是在包含 JavaFX 类、捆绑的 JRE 和由 [=10 生成的本机包装器的 .app 包中包含一个 "helper app" =].该助手应用程序将从 JavaFX 应用程序调用,并会显示应用程序内购买列表。伟大的!除了 IAP 只能使用 StoreKit 从它们在 iTunes Connect 上关联的应用程序包中访问。我的 .app 包中的辅助应用程序不能与主应用程序(本机包装器)共享相同的包 ID。

另一个解决方案是,如果我可以用我自己的可执行文件替换 javapackager 生成的简单本机包装器。当启动 .app 时,我自己的本机包装器会像当前包装器一样使用捆绑的 JRE 调用 JAR,但它也可以提供一个 UI 用于进行应用程序内购买(Java 部分及其包装器可能会很困难,但最终它可以通过像一个部分写入另一部分监控的 [沙盒] 文件这样愚蠢的事情来实现。

那么我的问题是:javapackager 生成的本机 wrapper/launcher 的源代码 – 或者 javapackager 本身的源代码 – 是否在任何地方都可用?如果没有,有谁知道 /Java 下的 .app 中捆绑的 JAR 文件是如何被该启动器调用的?

是的,你可以。

JavaFX 启动器的源代码可在 OpenJDK 网站上免费获得。首先,您需要从源存储库的 main/native/launcher/mac 文件夹中复制 main.m 文件。对于 Java FX 8,在此处:http://hg.openjdk.java.net/openjfx/8/master/rt/file/f89b7dc932af/modules/fxpackager/src/main/native/launcher/mac/main.m

然后您在 Xcode 中创建一个新项目并复制到 main.m 文件中。当您构建项目时,会生成一个 .app 包,并且在该包中的 Contents/Mac OS 文件夹下是您的新启动器可执行文件。将其复制到 javapackager 和 运行 正常生成的应用程序包中,首先执行的将是您的自定义启动器。