Как я могу добавить дополнительные файлы в мой архив MacOS .app и при этом пройти нотариальное заверение Apple?
Я знаю, что это долго, поэтому вот краткое резюме:
Я пытаюсь создать приложение и скопировать другие предварительно созданные сценарии или файлы в
.app/Contents/MacOS
каталог.Я могу получить что-то, что работает и все еще запрашивает у пользователя доступ к микрофону, но оно не пройдет нотариальное заверение (говоря, что подпись плохая). Я не могу сказать, неправильно ли я создаю DMG и / или PKG или, возможно, копирую файлы в место установки, где подпись?
Если я скопирую предварительно созданные файлы на месте, а затем заново подпишу свое приложение после архивации, я могу передать нотариальное заверение Apple, но тогда произойдет сбой доступа к микрофону из-за нарушения конфиденциальности (как будто я никогда не указывал права).
Вот более длинная версия с большим количеством деталей:
У меня есть приложение myApp, которое использует микрофон, который я строю как архив из командной строки с xcodebuild -scheme myApp archive -archivePath myApp.archive
,
Приложение работает, если я остановлюсь здесь. У меня есть соответствующие права, включена защита кода и NSMicrophoneUsageDescription
в моем списке.
Тем не менее, у меня есть различные другие ресурсы, которые я должен включить в свое приложение. Я хочу поместить их в myApp.app/Contents/MacOS
реж. Эти ресурсы включают в себя сценарий оболочки для отладки, вспомогательный инструмент Swift и т. Д.
Я считаю невозможным создать это приложение с надлежащей подписью и правами на доступ к микрофону в сочетании с прохождением нотариального заверения Apple.
Я копирую эти вторичные приложения в каталог назначения, определяя сценарий предварительного действия и последующего действия в XCode для действия Архива в моей схеме.
Сценарий архива перед действием
Сценарий предварительного действия подписывает все вторичные объекты моим сертификатом Application ID разработчика:
APP_SIGN_ID="Developer ID Application: MyCompany Inc. (XXXXXXXXXX)"
LOG="/tmp/archive.log"
rm -f $LOG
echo "Pre-action for archive" > $LOG
function sign_and_verify() {
echo "signing $1" >> $LOG
codesign --force --options runtime --verify --verbose --sign "$APP_SIGN_ID" "$1"
if [ $? -ne 0 ]; then
echo "failed signature" >> $LOG
exit 1
fi
}
# sign these things as a pre-action to archive and copy them to the Contents/MacOS in the post-action
sign_and_verify "${HOME}/src/bin/mydebugtool"
sign_and_verify "${HOME}/src/bin/myscript.sh"
Post-Action Archive Script
Сценарий post-action для архива в моей схеме копирует эти подписанные активы на место (копия должна быть выполнена как post-action, поскольку b/c dir назначения архива не существует на этапе предварительного действия):
LOG="/tmp/archive.log"
TARGETDIR="${ARCHIVE_PRODUCTS_PATH}/Applications/myApp.app/Contents/MacOS/"
function my_copy() {
echo "copying $1 to $2" >> $LOG
cp "$1" "$2"
if [ $? -eq 0 ]; then
echo "copy success" >> $LOG
else
echo "copy failure" >> $LOG
fi
}
my_copy "${HOME}/src/bin/mydebugtool" "${TARGETDIR}"
my_copy "${HOME}/src/bin/myscript.sh" "${TARGETDIR}"
Затем я создаю этот архив. Если я бегу open <path-to-archive>/myApp.app
он открывается правильно и запрашивает доступ к микрофону. Другие инструменты правильно в архиве.
Нотариальное заверение
Однако, когда я упаковываю содержимое архива в DMG или PKG, он не может быть заверен нотариально:
{
"logFormatVersion": 1,
"jobId": "5a225fdb-d85d-41fa-8bde-1026xx92331a",
"status": "Invalid",
"statusSummary": "Archive contains critical validation errors",
"statusCode": 4000,
"archiveFilename": "myApp.dmg",
"uploadDate": "2019-08-20T20:22:08Z",
"sha256": "d93da550d2617246aead790a13afc6360ff5198764cfb779b785e06d463d4e32",
"ticketContents": null,
"issues": [
{
"severity": "error",
"code": null,
"path": "myApp.dmg/myApp.app/Contents/MacOS/myApp",
"message": "The signature of the binary is invalid.",
"docUrl": null,
"architecture": "x86_64"
}
]
}
Обидно, что он терпит неудачу, потому что он отлично работает на Мохаве. Это никогда не будет работать на Каталину без прохождения нотариального заверения.
Поэтому я не могу сказать, происходит ли сбой из-за того, как я создаю DMG или PKG, или это сбой, потому что я помещаю вещи в каталог Contents/MacOS (даже если они подписаны?).
Как я строю DMG
Для ясности вот небольшой скрипт, который я использую для сборки DMG, который я пытаюсь заверить нотариально:
BASE_DIR=`pwd`"/myapp.archive.xcarchive/Products/Applications"
function create_dmg() {
echo "creating DMG"
rm -f temp.dmg
rm -f myApp.dmg
title=myApp
size=240
umount /Volumes/myApp
hdiutil create -srcfolder "${BASE_DIR}" -volname "${title}" -fs HFS+ \
-fsargs "-c c=64,a=16,e=16" -format UDRW -size ${size}m temp.dmg
device=$(hdiutil attach -readwrite -noverify -noautoopen temp.dmg | \
egrep '^/dev/' | sed 1q | awk '{print $1}')
mkdir /Volumes/"${title}"/.background
cp background.png /Volumes/"${title}"/.background/background.png
ln -s /Applications /Volumes/"${title}"/"Applications"
rm -rf /Volumes/"${title}"/.fseventsd
sleep 2
echo '
tell application "Finder"
tell disk "'${title}'"
open
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
set the bounds of container window to {400, 100, 950, 500}
set theViewOptions to the icon view options of container window
set arrangement of theViewOptions to not arranged
set icon size of theViewOptions to 150
set background picture of theViewOptions to file ".background:'background.png'"
set position of item "myApp" of container window to {120, 150}
set position of item "Applications" of container window to {430, 150}
set position of item ".background" of container window to {120, 525}
set position of item ".Trashes" of container window to {220, 525}
set position of item ".DS_Store" of container window to {320, 525}
set position of item ".fseventsd" of container window to {430, 525}
update without registering applications
delay 5
end tell
end tell
' | osascript
sync
sync
Как я строю PKG
Я также строю PKG, который также не проходит нотариальное заверение. Вот мой скрипт для сборки PKG:
PKG_SIGN_ID="Developer ID Installer: My Company Inc. (XXXXXXXXX)"
BASE_DIR=`pwd`"/myapp.archive.xcarchive/Products/Applications"
function create_pkg() {
echo "creating pkg"
rm -f myApp.pkg
# generate plists
cd $BASE_DIR
pkgbuild --analyze --root ./myApp.app myApp.plist
# pkgbuild myApp
pkgbuild --scripts /tmp/installer-scripts --root "./myApp.app" --component-plist "./myApp.plist" --identifier "com.mycompany.myapp.myApp" --version "$VERSION" --install-location "/Applications/myApp.app" ./myApp.pkg
if [ $? -ne 0 ]; then
echo "failed pkgbuild for myApp.pkg"
rm -f myApp.pkg
exit 1
fi
# copy the installer resources
cp -r ../../res ./
# --synthesize will generate the Distribution.xml file
productbuild --synthesize --resources ./res --package myApp.pkg Distribution.xml
if [ $? -ne 0 ]; then
echo "failed productbuild synthesize for Distribution.xml"
rm -f myApp.pkg
exit 1
fi
# add our title to the Distribution.xml that was generated
# I can't believe I have to splice this in after the synthesize but I couldn't find another way
cat Distribution.xml | sed $'3i\\\n<title>MyApp</title>\n' > mod.xml
mv mod.xml Distribution.xml
cat Distribution.xml | sed $'3i\\\n<welcome file="welcome.html"/>\n' > mod.xml
mv mod.xml Distribution.xml
cat Distribution.xml | sed $'3i\\\n<background file="background.png" mime-type="image/png" scaling="tofit"/>\n' > mod.xml
mv mod.xml Distribution.xml
cat Distribution.xml | sed $'3i\\\n<background-darkAqua file="background.png" mime-type="image/png" scaling="tofit"/>\n' > mod.xml
mv mod.xml Distribution.xml
productbuild --resources ./res --sign "$PKG_SIGN_ID" --distribution Distribution.xml myApp.$VERSION.pkg
if [ $? -ne 0 ]; then
echo "failed signature"
rm -f myApp.pkg
exit 1
else
echo "Successfully built and signed myApp.$VERSION.pkg"
mv myApp.$VERSION.pkg ../../../
# remove the unsigned package so we don't accidentally distribute that
rm -f myApp.pkg
fi
}
Я надеюсь, что это не так долго, что кто-то, кто может помочь, перестал читать. Я старался быть кратким, но также включал в себя столько деталей, сколько считаю нужным.
ОБНОВЛЕНИЕ: чтобы проверить, правильно ли я создаю DMG, я закомментировал сценарий архивации после действия, собрал приложение и DMG и получил его нотариально. Поэтому что-то из-за того, что я помещаю файлы в каталог Contents/MacOS как часть архива после действия, нарушает подпись.
**