2

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

它将运行更新,找到更新,准备好,然后当我点击“安装并重新启动”按钮时,它将无限期地停留在“安装更新...”屏幕上。

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

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

但是,我从来没有看到调用的日志消息,我假设这意味着我的委托没有被调用。

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

  • 我是否正确实施了委托?我是一个完整的 XCode 新手,所以我只知道它看起来像我在网上看到的示例,并且它可以编译。我在哪里声明代表重要吗?
  • 如果不是因为退出不正确,为什么 Sparkle 可能会冻结?

谢谢。

更新

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

但是,如果在我点击“安装并重新启动”按钮后立即切换到另一个应用程序(如 Chrome),它会在后台正常运行。如果 Sparkle 有焦点,它似乎不会自行关闭。很奇怪。

作为一种解决方法,我手动将“启用自动更新”设置为 true,这样它就可以在没有最终窗口的情况下完成所有操作,这可以工作......但并不是很理想。

4

2 回答 2

1

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

于 2015-02-12T14:40:01.593 回答
0

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

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

Sparkle 使用 NSTask 启动任务WithLaunchPath:arguments: 用新应用替换旧应用。在沙盒授权的情况下,并且不通过 Apple App Store 分发应用程序,由于缺少访问权限,NSTask 永远不会完成。

附加信息: https ://developer.apple.com/documentation/foundation/nstask/1414375-launchedtaskwithlaunchpath

于 2018-03-11T14:05:02.703 回答