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