„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie ich mit Go einfache Mac-Apps erstelle

Wie ich mit Go einfache Mac-Apps erstelle

Veröffentlicht am 29.07.2024
Durchsuche:410

Ich habe DarwinKit vor ein paar Jahren gestartet, weil es für Go keine Bindungen an native Mac-APIs gab. Wir haben das Projekt langsam in Bindungen und Generierungstools umgewandelt, um eines Tages eine vollständige Abdeckung aller Apple-APIs zu erreichen. Die Veröffentlichung von v0.5.0 letzte Woche ist die umfangreichste, die das Projekt je gesehen hat:

  • Bindungen für 33 Frameworks mit nahezu vollständiger Abdeckung:
    • 2.353 Klassen
    • 23.822 Methoden und Eigenschaften
    • 9.519 Konstanten/Aufzählungen
    • 543 Strukturen
  • Automatische Konvertierung und Verwendung nativer Go-integrierter Typen in APIs
  • Unterstützung für Blockargumente, da Go mit richtig typisierten Argumenten funktioniert
  • Vorgefertigte Delegate-Implementierungen, auf denen Sie einfach Go-Funktionen festlegen können
  • 1-zu-1-Zuordnung zu Objective-C-Symbolen, während sie immer noch idiomatisch für Go ist
  • Dokumentation für alle Symbole, einschließlich eines Links zu offiziellen Apple-Dokumenten zu diesem Symbol
  • Wachsende Sammlung hochwertiger Beispiel-Starter-Apps für Sponsoren

Demo Screenshots

Hier ist ein kurzes Beispiel für die Verwendung von DarwinKit zum Erstellen einer nativen Webview-Fensteranwendung in wenigen Zeilen von Go:

package main

import (
    "github.com/progrium/darwinkit/objc"
    "github.com/progrium/darwinkit/macos"
    "github.com/progrium/darwinkit/macos/appkit"
    "github.com/progrium/darwinkit/macos/foundation"
    "github.com/progrium/darwinkit/macos/webkit"
)

func main() {
    // runs macOS application event loop with a callback on success
    macos.RunApp(func(app appkit.Application, delegate *appkit.ApplicationDelegate) {
        app.SetActivationPolicy(appkit.ApplicationActivationPolicyRegular)
        app.ActivateIgnoringOtherApps(true)

        url := foundation.URL_URLWithString("https://github.com/sponsors/darwinkitdev")
        req := foundation.NewURLRequestWithURL(url)
        frame := foundation.Rect{Size: foundation.Size{1440, 900}}

        config := webkit.NewWebViewConfiguration()
        wv := webkit.NewWebViewWithFrameConfiguration(frame, config)
        wv.LoadRequest(req)

        w := appkit.NewWindowWithContentRectStyleMaskBackingDefer(frame,
            appkit.ClosableWindowMask|appkit.TitledWindowMask,
            appkit.BackingStoreBuffered, false)
        objc.Retain(&w)
        w.SetContentView(wv)
        w.MakeKeyAndOrderFront(w)
        w.Center()

        delegate.SetApplicationShouldTerminateAfterLastWindowClosed(func(appkit.Application) bool {
            return true
        })
    })
}

In weniger als 40 Zeilen haben wir eine native Mac-App erstellt, ohne XCode zu öffnen oder Objective-C zu verwenden. Ich denke, dass dies jetzt möglicherweise das beste Bindungsprojekt für Apple APIs ist, das es gibt. Möglicherweise sogar die beste Möglichkeit, kleine Dienstprogramme auf dem Mac zu erstellen. Und bald auch andere Apple-Geräte.

Die Zukunft

In DarwinKit fehlt ein großes Element: Es gibt keine Bindungen an Apple-Framework-Funktionen. Glücklicherweise werden die meisten Frameworks mit OOP erstellt, für das wir derzeit großartige Bindungen haben. Einige Frameworks, insbesondere Frameworks auf niedrigerer Ebene, sind jedoch hauptsächlich Funktionen. Es gibt zwar eine Problemumgehung, die die Verwendung von CGO beinhaltet (was DarwinKit zu vermeiden versucht), wir arbeiten jedoch an der Generierung nativer Go-Funktionsbindungen für jede Framework-Funktion.

Das andere große Ziel, auf das wir hinarbeiten, ist, dass DarwinKit überhaupt kein CGO mehr verwendet! Mit purego können wir Apple-Frameworks aufrufen, ohne CGO einzubeziehen. Dadurch wird die Erstellungszeit verkürzt, kleinere Binärdateien erstellt und die Verwendung von DarwinKit in Programmen ermöglicht, die aus irgendeinem Grund CGO vermeiden müssen.

An alle iOS- und Mobilentwickler da draußen: Ich möchte, dass dies wirklich für iOS funktioniert. Tatsächlich sollte es das schon sein! Aber wir generieren vorerst Bindungen für MacOS. Wenn jemand dabei helfen möchte, dies auf iOS zu bringen, damit die Leute mobile Apple-Apps mit Go erstellen können, wenden Sie sich bitte an uns!

Bis dahin versuchen Sie, eine App mit dem zu erstellen, was wir bisher haben. Lass mich wissen, wie es läuft!

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/progrium/how-i-build-simple-mac-apps-using-go-104j?1 Bei Verstößen wenden Sie sich zum Löschen bitte an [email protected] Es
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3