Можно ли использовать Sparkle в приложении Qt (Golang bindings)? - PullRequest
0 голосов
/ 05 декабря 2018

Мы создаем приложение 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:

но это для кода C ++ / Objective C.

Возможно ли использовать с Golang?Если да, то как?

1 Ответ

0 голосов
/ 11 декабря 2018

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 вызовите эту функцию:

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>
...