Ordnerspeicherorte für die macOS-App

Ich portiere eine Anwendung von Windows und Linux auf macOS.

Die Anwendung ist in Qt geschrieben. Es hat ein paar abhängige dylib (einige gebaut, einige sdk). Die exakt gleichen Bibliotheken und die gleiche Qt-Version werden für einige andere Anwendungen verwendet (die noch nicht portierbar sind). Es wird nicht über den App Store vertrieben.

Die Anwendung kann benutzerdefinierte Benutzerdateien lesen, schreiben, per Drag-and-Drop verschieben und drucken. Es verwendet eine sqlite3-Datenbank, vorausgesetzt, Benutzer sollten in der Lage sein, zu ihrem Speicherort zu navigieren (da sie auch die Möglichkeit haben sollten, eine Datenbank von einem anderen Speicherort aus zu verwenden). Während des Druckens ist es am besten, den temporären Ordner cups zu verwenden, um temporäre Bitmap-Dateien zu speichern.

Ich habe versucht herauszufinden, wie man diese Art von App am besten installiert. Ist die Bundle-Verpackung für diesen App-Typ geeignet oder sollte ich das Dateisystem verwenden, um alle erforderlichen Dateien an den wahrscheinlichsten Speicherorten abzulegen?

  1. Bisher habe ich beim Erstellen eines Bundles die Abhängigkeiten (einschließlich Qt-Frameworks) im Verzeichnis Contents/Frameworks.

    • Wo würde ich die vom Benutzer erstellten Dateien platzieren ... im Bundle oder im Users/MyCompany/MyProgramVerzeichnis? Ich habe versucht, darin zu speichern ... kann nicht innerhalb des Programms MyApp.app durchsuchen.
    • Wo würde ich die sqlite3-Datenbank platzieren? Wenn ich es in das Bündel lege (z. B. Contents/Resources), kann ich vom Programm aus nicht darauf zugreifen.
    • Wo würde das gesamte Bundle installiert werden? in /Applications/MyCompany/MyProductist meine Vermutung?
  2. Ohne Bündel: Nach dem, was ich gelesen habe, können die folgenden gute Orte sein:

    • Für die ausführbare Datei: /Applicationswie oben?
    • Für die abhängigen Bibliotheken: usr/share/MyCompany/MyProductoder /Library/MyCompany/MyProduct?
    • Benutzerdateien offensichtlichUsers/MyCompany/MyProgram
    • Ressourcendatenbank ? Ich habe keine Ahnung, was ein guter Ort ist, der für alle Benutzer zugänglich ist, wo man eine solche Datei aufbewahren kann
    • Dieses Setup würde es anderen Anwendungen ermöglichen, installiert zu werden und dasselbe Qt-Framework und abhängige Dylibs zu verwenden ... Aber ich habe etwas darüber gelesen, dass Apps nicht funktionieren, wenn die Dylibs geändert werden?

Was ist der beste Weg und in diesem Fall, welches sind die besten Ordnerspeicherorte?

Soll ich davon ausgehen, dass die Installation mit sudo-Rechten erfolgt? Kann die Installation ohne Admin-Rechte durchgeführt werden?

Antworten (1)

Das Anwendungspaket sollte in /Applications abgelegt werden. Dieses Anwendungspaket sollte alles enthalten . Bibliotheken, Abhängigkeiten, alles, was die App zum Ausführen benötigt, damit das Anwendungspaket ausgeführt werden kann, wenn es in das /Applications-Verzeichnis eines anderen Computers kopiert wird.

Für die Installation in /Applications ist ein Administrator erforderlich. Sollte der Administrator nicht verfügbar sein, ist der Standardspeicherort für eine Einzelbenutzeranwendung ~/Applications. Dieses Verzeichnis sollte nicht vorhanden sein.

Wenn für die App etwas auf dem System „installiert“ werden muss, wie z. B. die oben erwähnte „Ressourcendatenbank“, sollte die App zur Installation auffordern in:

/Library/Application Support/developername/appname/

Sollte etwas für den aktuellen Benutzer „installiert“ werden müssen, sollte es in denselben Pfad gehen, dem sein Home-Verzeichnis vorangestellt ist. Dies erfordert keinen Administrator.

~/Library/Application Support/developername/appname/

Benutzerdateien sollten nicht im Stammverzeichnis des Benutzerverzeichnisses gespeichert werden. Der Benutzer sollte die Möglichkeit haben, Dateien zu speichern, wo immer er möchte, vorzugsweise mit einem standardmäßigen OS X-Speicherdialog.

Auch…

  • Cache-Dateien sollten hineingehen:

    ~/Library/Caches/developername/appname/
    
  • Die Benutzereinstellungen sollten hineingehen:

    ~/Library/Preferences/com.bundleidentifier.plist
    

    Wenn mehr als eine einzelne Eigenschaftsliste gespeichert werden muss…

    ~/Library/Preferences/developername/appname/
    
muss ich etwas tun, um es in /Applications zu installieren? Oder ist das der Standardort, an dem eine App installiert wird? Würde ich einen Paketmanager verwenden, um den Zielspeicherort anzugeben?
@Thalia Normalerweise installiert ein Benutzer eine App in OS X, indem er das .app-Bundle herunterlädt und es mit dem Finder nach /Applications kopiert und es dann öffnet, um es zu verwenden.
In Windows und Linux verwendet die Anwendung eine .ini-Datei, um Benutzereinstellungen zu speichern (viel mehr als Windows-Positionen und letzte Speicherorte ... auch Einstellungen zu Tools innerhalb der Anwendung). Die INI-Datei ist ein einfacher Text mit Schlüssel-Wert-Paaren (nicht XML). Könnte ich dieselbe Datei anstelle einer plist verwenden und sie in ~/Library/Preferences/com.bundleidentifier.settings oder so ähnlich ablegen?
Wenn Benutzer nur das App-Bundle erhalten ... wie stelle ich die Ressourcendatenbank bereit?
@Thalia Technisch besagen Best Practices, dass es sich um eine .plist handeln sollte, aber nichts hindert Sie daran, eine Textdatei oder ähnliches zu verwenden. Wenn Sie wirklich eine Textdatei verwenden, aber auch Best Practices befolgen möchten, legen Sie Ihre Textdatei in einem Ordner ab (im Ordner „Application Support“). Von Apps in OS X wird erwartet, dass sie sich selbst vorbereiten: eine fehlende Datenbank erkennen und die Ressource von einem externen Server herunterladen.
Als Nachtrag, wenn Sie die App erstellen, gehen Sie bitte nicht davon aus/Applications , dass die App in oder existieren wird ~/Applications! Benutzer können sich dafür entscheiden, bestimmte Apps aus organisatorischen Gründen zu behalten oder an einen anderen Ort zu verschieben. Die App sollte unabhängig von ihrem Standort funktionieren, es sei denn, Sie haben einen sehr guten Grund, dies nicht zuzulassen (in diesem Fall möchten Sie dennoch den Standort überprüfen und den Benutzer benachrichtigen).
@Thalia In Bezug auf die INI-Datei würde ich die Standardkopie in den Ressourcenordner im Anwendungspaket aufnehmen. Prüfen Sie beim Start der App, ob die INI-Datei bereits in ~/Library/Preferences; Wenn dies nicht der Fall ist, kopieren Sie die Standarddatei aus Ihrem App-Bundle in ~/Library/Preferences.
@grg: Danke für eine sehr klare und nützliche Antwort. Hier ist eine interessante Übersicht aus der Entwicklerdokumentation.