Как я могу добавить дополнительные файлы в мой архив 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 как часть архива после действия, нарушает подпись.

**

0 ответов

Другие вопросы по тегам