是否可以在 Qt(Golang 绑定)应用程序中使用 Sparkle?
Is it possible to use Sparkle in Qt (Golang bindings) app?
我们使用以下方法构建了一个 Qt 应用程序:https://github.com/therecipe/qt。
现在我们需要一个自动更新器并找到这个:https://sparkle-project.org
看起来它正在被我机器上的多个应用程序使用:
/Applications/VLC.app/Contents/Frameworks/Sparkle.framework
/Applications/Adium.app/Contents/Frameworks/Sparkle.framework
/Applications/TeamViewer.app/Contents/Frameworks/Sparkle.framework
/Applications/Docker.app/Contents/Frameworks/Sparkle.framework
...
一些文章告诉我如何在 Qt 中使用它:
- http://www.discoversdk.com/knowledge-base/using-sparkle-in-qt
- https://github.com/sparkle-project/Sparkle/issues/1137#issuecomment-336667547
但它适用于 C++/Objective C 代码。
可以用Golang吗?如果是,怎么做?
https://github.com/therecipe/qt/issues/743#issuecomment-444689169
sparkle.m:
#import <Headers/SUUpdater.h>
static SUUpdater* updater = nil;
void sparkle_checkUpdates()
{
if (!updater) {
updater = [[SUUpdater sharedUpdater] retain];
}
[updater setUpdateCheckInterval:3600];
[updater checkForUpdatesInBackground];
}
sparkle.go:
// +build darwin windows
package main
/*
#cgo CFLAGS: -I ${SRCDIR}/Sparkle.framework
#cgo LDFLAGS: -F ${SRCDIR} -framework Sparkle
void sparkle_checkUpdates();
*/
import "C"
func sparkle_checkUpdates() {
C.sparkle_checkUpdates()
}
然后在 main.go
中调用 func:
action := widgets.NewQMenuBar(nil).AddMenu2("").AddAction("Check for Updates...")
// http://doc.qt.io/qt-5/qaction.html#MenuRole-enum
action.SetMenuRole(widgets.QAction__ApplicationSpecificRole)
action.ConnectTriggered(func(bool) { sparkle_checkUpdates() })
appcast.xml:
<?xml version="1.0" standalone="yes"?>
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
<channel>
<title>Premium VPN</title>
<item>
<title>1.0.0.2905</title>
<pubDate>Tue, 11 Dec 2018 11:09:10 +0800</pubDate>
<sparkle:minimumSystemVersion>10.7</sparkle:minimumSystemVersion>
<enclosure url="https://example.com/x.zip" sparkle:version="1.0.0.2905" sparkle:shortVersionString="1.0.0.2905" sparkle:edSignature="$(/path/to/Sparkle/bin/sign_update)" length="104408678" type="application/octet-stream"/>
</item>
</channel>
</rss>
Info.plist:
<key>SUFeedURL</key>
<string>https://example.com/appcast.xml</string>
<key>SUPublicEDKey</key>
<string>$(/path/to/Sparkle/bin/generate_keys)</string>
我们使用以下方法构建了一个 Qt 应用程序:https://github.com/therecipe/qt。 现在我们需要一个自动更新器并找到这个:https://sparkle-project.org
看起来它正在被我机器上的多个应用程序使用:
/Applications/VLC.app/Contents/Frameworks/Sparkle.framework
/Applications/Adium.app/Contents/Frameworks/Sparkle.framework
/Applications/TeamViewer.app/Contents/Frameworks/Sparkle.framework
/Applications/Docker.app/Contents/Frameworks/Sparkle.framework
...
一些文章告诉我如何在 Qt 中使用它:
- http://www.discoversdk.com/knowledge-base/using-sparkle-in-qt
- https://github.com/sparkle-project/Sparkle/issues/1137#issuecomment-336667547
但它适用于 C++/Objective C 代码。
可以用Golang吗?如果是,怎么做?
https://github.com/therecipe/qt/issues/743#issuecomment-444689169
sparkle.m:
#import <Headers/SUUpdater.h>
static SUUpdater* updater = nil;
void sparkle_checkUpdates()
{
if (!updater) {
updater = [[SUUpdater sharedUpdater] retain];
}
[updater setUpdateCheckInterval:3600];
[updater checkForUpdatesInBackground];
}
sparkle.go:
// +build darwin windows
package main
/*
#cgo CFLAGS: -I ${SRCDIR}/Sparkle.framework
#cgo LDFLAGS: -F ${SRCDIR} -framework Sparkle
void sparkle_checkUpdates();
*/
import "C"
func sparkle_checkUpdates() {
C.sparkle_checkUpdates()
}
然后在 main.go
中调用 func:
action := widgets.NewQMenuBar(nil).AddMenu2("").AddAction("Check for Updates...")
// http://doc.qt.io/qt-5/qaction.html#MenuRole-enum
action.SetMenuRole(widgets.QAction__ApplicationSpecificRole)
action.ConnectTriggered(func(bool) { sparkle_checkUpdates() })
appcast.xml:
<?xml version="1.0" standalone="yes"?>
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
<channel>
<title>Premium VPN</title>
<item>
<title>1.0.0.2905</title>
<pubDate>Tue, 11 Dec 2018 11:09:10 +0800</pubDate>
<sparkle:minimumSystemVersion>10.7</sparkle:minimumSystemVersion>
<enclosure url="https://example.com/x.zip" sparkle:version="1.0.0.2905" sparkle:shortVersionString="1.0.0.2905" sparkle:edSignature="$(/path/to/Sparkle/bin/sign_update)" length="104408678" type="application/octet-stream"/>
</item>
</channel>
</rss>
Info.plist:
<key>SUFeedURL</key>
<string>https://example.com/appcast.xml</string>
<key>SUPublicEDKey</key>
<string>$(/path/to/Sparkle/bin/generate_keys)</string>