Sparkle冻结“安装更新......”

时间:2014-03-06 18:59:29

标签: xcode delegates sparkle brackets-shell

我试图在括号shell应用程序中实现Sparkle。我相信我已经正确设置了一切,但似乎失败了。

它将运行更新,找到更新,准备就绪,然后当我点击"安装并重新启动"按钮,它将位于"安装更新..."屏幕无限期。

我认为也许是括号shell不想关闭它的最后一个孩子,所以我尝试实现updaterWillRelaunchApplication委托方法。我尝试在函数之前添加它,我打电话来检查我的更新,如下所示:

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

但是,我从未看到调用过的日志消息,我假设这意味着我的代表没有被调用。

所以,我基本上有两个问题:

  • 我是否正确实施了代理?我是一个完整的XCode新手,所以我只知道它看起来像我在网上看到的例子,它编译。我在哪里宣布代表是否重要?
  • 任何想法为什么Sparkle可能因为不正常退出而冻结?

感谢。

更新

我发现了一种奇怪而有趣的行为。如果我在完成更新后没有任何窗口(我的应用程序窗口或Sparkle窗口)聚焦,它将完全正常工作。如果我要么专注,那么我的主窗口会关闭(就像它试图重启一样),但Sparkle窗口保持打开状态。然后我必须右键单击并关闭应用程序。

然而,如果我在点击"安装并重新启动后立即#34;按钮我翻转到另一个应用程序(如Chrome),它将在后台运行得很好。如果有焦点,Sparkle似乎不会自我关闭。很奇怪。

作为一种解决方法,我手动设置"启用自动更新"如果它没有那个最后一个窗口就可以做到这一点,它起作用......但并不是很理想。

2 个答案:

答案 0 :(得分:1)

我遇到了和你一样的问题。经过一番头疼,我发现里面有 sparkle.framework - >资源 - > Autoupdate 。当我看到内容时,它没有Autoupdate作为可执行文件(内容 - > MacOS - > Autoupdate)。在将其作为可执行文件后,它重新完成了。

答案 1 :(得分:0)

您是否通过应用商店分发您的应用?有同样的问题 - 通过HockeyApp分发应用程序。

事实证明我在我的功能中打开了App Sandbox,这导致了所描述的行为。

Sparkle使用NSTask launchTaskWithLaunchPath:arguments:用新的应用程序替换旧应用程序。如果是Sandbox权利而不是通过Apple App Store分发应用程序,则由于缺少访问权限,NSTask永远不会完成。

其他信息: https://developer.apple.com/documentation/foundation/nstask/1414375-launchedtaskwithlaunchpath