Sparkle зависает на "Установка обновления..."

Я пытаюсь реализовать Sparkle в приложении-оболочке. Я верю, что у меня все настроено правильно, но, похоже, не получается.

Он запустится через обновление, найдет обновление, подготовит его, а затем, когда я нажму кнопку "Установить и перезапустить", будет неопределенно долго находиться на экране "Установка обновления...".

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

@implementation NSObject (SUUpdaterDelegateInformalProtocol)
- (void)updaterWillRelaunchApplication:(SUUpdater *)updater {
    NSLog(@"Closing properly");
    // code to close properly
}
@end

Тем не менее, я никогда не вижу вызванного сообщения журнала, которое, как я предполагаю, означает, что мой делегат не вызывается.

Итак, у меня есть два вопроса:

  • Правильно ли я выполняю делегат? Я новичок в XCode, так что я просто знаю, что это выглядит примерно так, как примеры, которые я видел в сети, и он компилируется. Имеет ли значение, где я объявляю делегата?
  • Есть идеи, почему Sparkle может замерзнуть, если это происходит не из-за неправильного выхода?

Благодарю.

Обновить

Я обнаружил очень странное и интересное поведение. Если у меня не будет ни одного окна (окна моего приложения или окна Sparkle), когда оно завершит обновление, оно будет работать совершенно нормально. Если я либо сфокусировался, то произойдет, что мое главное окно закроется (как будто оно пытается перезапуститься), но окно Sparkle останется открытым. Затем я должен щелкнуть правой кнопкой мыши и закрыть приложение.

Однако, если сразу после того, как я нажму кнопку "Установить и перезапустить", я переключусь на другое приложение (например, Chrome), оно будет прекрасно работать в фоновом режиме. Кажется, что Sparkle не закроется, если у него есть фокус. Очень странно.

Как своего рода обходной путь, я вручную установил для параметра "включить автоматические обновления" значение true, чтобы он делал все без этого последнего окна, которое работает... но на самом деле не идеально.

2 ответа

У меня была та же проблема, что и у вас. После некоторого момента, когда я почесал голову, я обнаружил, что внутри sparkle.framework ->Resources-> Autoupdate. когда я увидел содержимое, оно не имело Autoupdate в качестве исполняемого файла (Contents->MacOS->Autoupdate). После того, как сделать его исполняемым, он отлично перезапустился.

Вы распространяете свое приложение через магазин приложений? Была такая же проблема - распространение приложения через HockeyApp.

Оказалось, что в моих возможностях включена App Sandbox, что привело к описанному поведению.

Sparkle использует NSTask launchTaskWithLaunchPath: arguments: для замены старого приложения новым. В случае разрешений Sandbox и отсутствия распространения приложения через Apple App Store, NSTask никогда не завершается из-за отсутствия прав доступа.

Дополнительная информация: https://developer.apple.com/documentation/foundation/nstask/1414375-launchedtaskwithlaunchpath

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