2016-11-07 5 views
2

Ich entwickle eine Cross-Plattform-Anwendung mit Qt 5.6. Wenn die Anwendung gestartet wird, erstellt es eine einzelne Datei auf dem App-Verzeichnis:Permisison Probleme mit Qt App auf MAC OS Sierra

QFile file; 

// /MyApp.app/Contents/MacOS 
file.setFileName(QApplication::applicationDirPath() + QString("/file.csv"); 
file.open(QIODevice::ReadWrite | QIODevice::Truncate); 

... 

file.close(); 

Das funktioniert völlig in Ordnung mit alten Versionen O X, aber da Sierra, diese Datei regeneriert wird nicht (nur wenn die App aus dem Internet heruntergeladen). Beachten Sie, dass ich meine App nicht im MAC-Store veröffentliche. Ich verwende einfach eine .dmg-Datei.

Hier sind einige Tests, die ich getan habe:

  • die App Kompilieren und starten auf Sierra =>OK
  • die App Kompilieren, eine .dmg erstellen und den Start auf Sierra =>OK
  • die App Kompilieren, erstellen Sie eine .dmg (die ich hochgeladen), das Herunterladen und starten der App auf Sierra =>FAIL

Ich denke, das Problem ist mit Zugriffsberechtigungen verknüpft. Diese einzelne Befehlszeile meines Problem lösen, aber natürlich kann ich nicht, dass die Lösung für meine Nutzer geben:

sudo spctl --master-disable 

Dies ist, wie ich meine Bewerbung unterschreiben:

# Signing application 
codesign --force --deep --sign "Developer ID Application: *** ***" /MyPath/MyApp.app 

# Validating signature 
spctl --assess --verbose /MyPath/MyApp.app 

Und hier ist meine Info. plist-Datei, erzeugt von Qt:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>NSPrincipalClass</key> 
    <string>NSApplication</string> 
    <key>CFBundleIconFile</key> 
    <string>mac_app_icon.icns</string> 
    <key>CFBundlePackageType</key> 
    <string>APPL</string> 
    <key>CFBundleGetInfoString</key> 
    <string>Created by Qt/QMake</string> 
    <key>CFBundleSignature</key> 
    <string>????</string> 
    <key>CFBundleExecutable</key> 
    <string>MyApp</string> 
    <key>CFBundleIdentifier</key> 
    <string>com.company.myapp</string> 
    <key>NOTE</key> 
    <string>This file was generated by Qt/QMake.</string> 
    <key>LSUIElement</key> 
    <true/> 
</dict> 
</plist> 

ich mit MAC Unterzeichnung Werkzeug nicht sehr vertraut bin, so würde jede mögliche Hilfe sehr geschätzt. Vielen Dank.

Antwort

4

Wahrscheinlich nicht die Antwort, die Sie suchen, aber es war beste Praxis, Daten für einige Zeit von ausführbaren Dateien zu speichern. Schreiben an der Stelle QApplication::applicationDirPath() ist nicht ratsam.

Im Idealfall sollten Sie Laufzeitinformationen in Standard Standorten werden die Speicherung:

http://doc.qt.io/qt-5/qstandardpaths.html#StandardLocation-enum

QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).first(); 
+0

Sie sind total richtig. Unglücklicherweise habe ich keine Wahl für diese spezielle Datei. – Sierra

+0

@Sierra Ich weiß nicht aus eigener Erfahrung, aber ich würde wahrscheinlich versuchen, eine GUI sudo, um den Befehl auszuführen, den Sie benötigen, der Benutzer würde dann zur Eingabe des Kennworts aufgefordert werden und weiter wie gewohnt: http: //www.performantdesign. com/2009/10/26/cocoasudo-a-graphical-kakaobasiert-alternativ-zu-sudo/ –

+0

Ja, es wäre perfekt, aber 'AuthorizationExecuteWithPrivileges' scheint seit OS_X 10.7 veraltet zu sein – Sierra

Verwandte Themen