7

我正在尝试将 Java 应用程序分发给 OS X 用户。我没有使用 Mac 商店 - 它是通过我自己的网站分发的。无论我尝试什么,OS X 的 Gatekeeper 都会拒绝该应用程序。

这是我的方法:

(1) 像往常一样构建app,得到一个JAR文件

(2)appbundler按照此处所述使用:https ://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html 。这会在我的 JAR 周围创建一个运行良好的 .app,并在MyApp.app/Contents/PlugIns目录中包含 JVM。

(3) 使用我的开发者证书签署应用程序:

codesign -s 'Developer ID Application: MyCompany Ltd' --deep MyApp.app

...过程成功完成

(4) 验证 .app 将遵守 Gatekeeper 的铁腕法律:

spctl --assess --verbose=4 --type execute MyApp.app

...我得到的结果是:

MyApp.app: a sealed resource is missing or invalid

对我来说似乎不是很冗长!我可能做错了什么?或者我怎样才能获得更多信息?

SO/Google 围绕“密封资源...”进行搜索是指签名框架(我没有)或建议使用该--force选项签名(我尝试过但不起作用)。

4

1 回答 1

8

你不能使用--deep. 这听起来像是正确的选择,因为您还需要签署嵌入式 JRE,但它不起作用。来自Apple 的文档

重要提示:虽然 --deep 选项可以应用于签名操作,但不建议这样做。我们建议您在各个阶段从里到外对代码进行签名(就像 Xcode 自动执行的那样)。使用 --deep 签名仅用于紧急维修和临时调整。

经过大量的拉扯,我从各种教程中拼凑起来。 这个是最有帮助的。这是我作为 Ant 脚本的最终解决方案:

<!-- code sign -->
<exec executable="chmod">
    <arg line="a+w ${build.dir}/Mac/MyApp.app/Contents/PlugIns/jre"/>
</exec>

<apply executable="codesign"> <!-- note: this loops through the contents of dir -->
    <arg line="-f -s 'Developer ID Application: My Organization'"/>
    <fileset dir="${build.dir}/Mac/MyApp.app/Contents/PlugIns/jre" />
</apply>

<exec executable="codesign" dir="${build.dir}/Mac"> 
    <arg line="-f -s 'Developer ID Application: My Organization' MyApp.app/Contents/PlugIns/jre"/>
</exec>

<exec executable="codesign" dir="${build.dir}/Mac"> 
    <arg line="-f -s 'Developer ID Application: My Organization' MyApp.app/Contents/PlugIns/jre/Contents/_CodeSignature/CodeResources"/>
</exec>

<!-- also codesign anything else in _CodeSignature (see comments) -->

<exec executable="codesign" dir="${build.dir}/Mac">
    <arg line="-f -s 'Developer ID Application: My Organization' MyApp.app"/>
</exec>


<!-- verify codesign -->
<exec executable="codesign" dir="${build.dir}/Mac" failonerror="true">
    <arg line="-vv MyApp.app"/>
</exec>


<!-- verify gatekeeper -->
<exec executable="spctl" dir="${build.dir}/Mac" failonerror="true">
    <arg line="-vv --assess --type execute MyApp.app"/>
</exec>

要注意的另一件事是zip在签名后不要使用命令行打包您的应用程序,因为它会破坏应用程序的协同设计。您应该使用productbuild、PackageMakerxip或 dmg 将其打包。

于 2014-11-14T20:45:26.503 回答