Java-приложение с кодовым обозначением для OS X Gatekeeper
Я пытаюсь распространить приложение Java среди пользователей OS X. Я не пользуюсь магазином Mac - он должен распространяться через мой собственный сайт. Что бы я ни пытался, Gatekeeper OS X отклоняет приложение.
Вот мой метод:
(1) Создайте приложение как обычно, получите файл JAR
(2) Использование appbundler
как описано здесь: https://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html. Это создает.app вокруг моего JAR, который работает хорошо, и содержит JVM в MyApp.app/Contents/PlugIns
каталог.
(3) Подпишите приложение с моим сертификатом разработчика:
codesign -s 'Developer ID Application: MyCompany Ltd' --deep MyApp.app
... процесс успешно завершен
(4) Убедитесь, что.app будет придерживаться законов Железного кулака Привратника:
spctl --assess --verbose=4 --type execute MyApp.app
... и в результате я получаю:
MyApp.app: a sealed resource is missing or invalid
Мне не кажется многословным! Что я могу делать не так? Или как я могу получить больше информации?
SO / Google выполняет поиск по "запечатанному ресурсу...", ссылаясь на рамки подписи (которых у меня нет) или предлагая подписать с помощью --force
вариант (который я пробовал, но не работает).
1 ответ
Вы не можете использовать --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
, PackageMaker, xip
или в dmg.