Electron Updater загружает обновление, но не устанавливает его на macOS (Squirrel.Mac)

У меня есть кроссплатформенное приложение Electron, которое я развертываю и публикую на Github. Я реализовал собственную логику автообновления с помощью библиотеки electronic-updater. Это прекрасно работает в Windows, однако в macOS это немного проблематично. Я успешно подписал и нотариально заверил приложение и уверен, что проблема не связана с этой частью.

  • Версия macOS: Вентура 13.1
  • Электронная версия: 21.3.0
  • Электронный строитель: 23.6.0
  • Электрон-обновитель: 5.3.0
  • Версия узла: 19.0.1

Мое приложение запускается как обычно, уведомляет пользователя об обновлении при получении события загрузки обновления и спрашивает пользователя, хотят ли они обновить приложение. Если пользователь нажимает кнопку «Установить и перезапустить», приложение вызывает функцию quitAndInstall(), которая ничего не делает. Ни закрывает приложение, ни перезапускает его. Кроме того, когда я перезапускаю приложение вручную, оно снова уведомляет и запрашивает пользователя. И это продолжается и продолжается в том же духе.

autoUpdater.checkForUpdatesAndNotify();
autoUpdater.on('update-downloaded', (info) => {
    // Show a dialog asking the user if they want to restart the app to install the update
    dialog.showMessageBox({
      type: 'question',
      buttons: ['Install and Restart', 'Later'],
      defaultId: 0,
      message: 'A new update has been downloaded. Would you like to install and restart the app now?'
    }, (response) => {
      if (response === 0) {
        // User clicked 'Install and Restart'
        autoUpdater.quitAndInstall();
      }
    });
});

Я проверил журналы автоматического обновления и увидел, что последнее обновление загружено на мою машину. Однако почему-то его не заменяют старой версией. Когда я перезапускаю приложение, снова регистрируется тот же набор журналов, что и ниже. Я попытался дождаться завершения последнего зарегистрированного шага, но, похоже, он застрял там до конца времени. Мои журналы автоматического обновления выглядят следующим образом:

[2023-01-08 11:37:05.284] [info]  Checking for update
[2023-01-08 11:37:06.789] [info]  Found version 1.0.8 (url: Duolance-Tracker-1.0.8-mac.zip, Duolance-Tracker-1.0.8.dmg)
[2023-01-08 11:37:06.791] [info]  Downloading update from Duolance-Tracker-1.0.8-mac.zip, Duolance-Tracker-1.0.8.dmg
[2023-01-08 11:37:06.796] [warn]  sysctl shell command to check for macOS Rosetta environment failed: Error: Command failed: sysctl sysctl.proc_translated
sysctl: unknown oid 'sysctl.proc_translated'

[2023-01-08 11:37:06.800] [info]  Checked 'uname -a': arm64=false
[2023-01-08 11:37:07.162] [info]  Update has already been downloaded to /Users/ardaakcabuyuk/Library/Application Support/Caches/duolancetracker-updater/pending/Duolance-Tracker-1.0.8-mac.zip).
[2023-01-08 11:37:10.983] [info]  / requested
[2023-01-08 11:37:10.988] [info]  /3cd1718f82c50e8105236129abe5fcfac9263b740235c99b2b23bc22cfd581c9d49d1e30dbbb897397f626e45c20d0fda5dc02336633b6cabf7214322e322714.zip requested
[2023-01-08 11:37:10.989] [info]  /3cd1718f82c50e8105236129abe5fcfac9263b740235c99b2b23bc22cfd581c9d49d1e30dbbb897397f626e45c20d0fda5dc02336633b6cabf7214322e322714.zip requested by Squirrel.Mac, pipe /Users/ardaakcabuyuk/Library/Application Support/Caches/duolancetracker-updater/pending/Duolance-Tracker-1.0.8-mac.zip

Я подозревал, что эта проблема может возникать из-за новой macOS Ventura, однако в macOS Monterey поведение такое же. Моя конфигурация сборки:

"mac": {
      "asarUnpack": "**/*.node",
      "category": "public.app-category.productivity",
      "target": [
        "default"
      ],
      "icon": "build/icon.icns",
      "entitlements": "build/sign/entitlements.mac.plist",
      "entitlementsInherit": "build/sign/entitlements.mac.plist",
      "hardenedRuntime": true,
      "gatekeeperAssess": false,
      "extendInfo": {
        "NSAppTransportSecurity": {
           "NSAllowsArbitraryLoads": true
         },
         "NSExceptionDomains": {
           "localhost": {
             "NSTemporaryExceptionAllowsInsecureHTTPSLoads": false,
             "NSIncludesSubdomains": false,
             "NSTemporaryExceptionAllowsInsecureHTTPLoads": true,
             "NSTemporaryExceptionMinimumTLSVersion": "1.0",
             "NSTemporaryExceptionRequiresForwardSecrecy": false
           }
         }
       }
    }

Я с нетерпением жду любых предложений. Надеюсь, от кого-то, кто страдал от той же проблемы, с которой я пытаюсь справиться.

Я перепробовал все предлагаемые решения, существующие в Интернете, однако не смог найти выхода.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему. В моем случае это была ошибка разрешения файла только для чтения. Что я могу предложить, так это проверить журналы ShipIt. Он находится по адресу /Users/[xxx]/Library/Caches/[your_application_id].ShipIt/ShipIt_stderr.log. Решение проблемы с разрешениями не устранило неработающую функцию quitAndInstall. Что я сделал для этого, так это изменил код диалога в соответствии с документацией. Новая версия, я думаю, следует паттерну Promise.

dialog.showMessageBox({
    type: 'question',
    buttons: ['Install and Restart', 'Later'],
    defaultId: 0,
    message: 'A new update has been downloaded. Would you like to install and restart the app now?'
}).then(selection => {
    if (selection.response === 0) {
        // User clicked 'Install and Restart'
        autoUpdater.quitAndInstall();
    }
});

Надеюсь, это поможет, если кто-то сталкивается с той же проблемой.

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