leider kommt es immer öfters vor, dass ich mit AppWrapper meine Apps und DMG nicht signieren kann. Die Entwickler AppWrapper sind zwar bemüht, aber wenn ich mehrere Tage kein Update meiner App veröffentlichen kann, ist das schon sehr unschön. Sicherlich hängen viele Probleme damit zusammen, das Apple ständig Anpassungen vornimmt.
Wie macht ihr das und welche Alternativen hätte ich?
Hi,
wenn die Signierung nicht stimmt, dann kann z.B. die App nicht auf die Festplatte etc. zugreifen.
Sam Rowlands arbeitet schon an einer Lösung.
Ins AppStore gehen die Apps nicht, sondern via Webserver steht die zum Download bereit.
Verrätst du mir deine Variante?
Wenn App Wrapper es nicht macht, dann mach es selber im Terminal.
Soweit ich mich erinnere kann App Wrapper doch ein Protokoll anzeigen, wo drin steht was er macht.
Kannst DU quasi nachmachen mit er Korrektur, die Du brauchst.
Bei der Signierung tritt kein Fehler auf (app sowie dmg Image). Im Log kann ich auch keine Fehlermeldung ausmachen und leider auch nicht die Shell Commands. Nur das Ergebnis auf den Kunden Rechnern besagt, dass die Software keine Rechte hat. Bis vor ca. 4 Wochen klappte es noch korrekt. Dann traten die Problem mit der DMG Signierung auf, laut Sam sollte ich die Version 4 nehmen, aber die ist auch noch bugy.
Wie macht ihr das denn?
Codesignieren ist speziell. Was ist “hat keine Rechte”? Betrifft das die App oder die dmg-Datei? Spätestens beim Notarisieren sollte irgendetwas kommen als Fehler.
Du solltest natürlich Deine App auf Deinen eigenen Rechnern testen. Zur Not mit VMWare oder Parallels, was immer wieder resettet wird.
Hier ist mein Codesign Script:
dim appPath as string = currentBuildLocation + "/" + shellEncode(currentBuildAppName)
if right(appPath, 4) <> ".app" then appPath = appPath + ".app"
Dim isDebugBuild as boolean = right( currentBuildAppName, 6 ) = ".debug"
dim result, errors as string
result = doShellCommand("/usr/bin/touch -acm " + appPath)
result = doShellCommand("xattr -rc " + appPath)
If result <> "" then print result
'codesign of lite version is done with extra script
if ConstantValue("App.kMaxVersion") = "2" then Return
dim DevID as String = "'Developer ID Application: Beatrix Willius'"
result = DoShellCommand("/usr/bin/codesign --timestamp -f -s " + DevID + " " + appPath + "/Contents/MacOS/*")
'print "result 1: " + result
result = DoShellCommand("/usr/bin/codesign --timestamp -f -s " + DevID + " " + appPath + "/Contents/Frameworks/*")
'print "result 2: " + result
'result = DoShellCommand("/usr/bin/codesign --timestamp -f -s " + DevID + " " + appPath + "/Contents/vcomponents_x64/*")
'print "result 3: " + result
result = DoShellCommand("/usr/bin/codesign --timestamp -f -s " + DevID + " " + appPath + "/Contents/Resources/*")
'print "result 4: " + result
result = DoShellCommand("/usr/bin/codesign --timestamp -f --options runtime --entitlements /Users/beatrixwillius\ 1/Documents/Development/Mail\ Archiver/Classes/Build\ Automation/entitlements.plist --deep -s " + DevID + " " + appPath + "/Contents/Library/Helpers/*")
'print "result 4b: " + result
result = DoShellCommand("/usr/bin/codesign --timestamp -f -s " + DevID + " " + appPath + "/Contents/Library/LoginItems/*")
'print "result 4b: " + result
result = DoShellCommand("/usr/bin/codesign --timestamp -f -s " + DevID + " " + appPath)
'print "result 5: " + result
result = DoShellCommand("/usr/bin/codesign --timestamp -f --options runtime --entitlements /Users/beatrixwillius\ 1/Documents/Development/Mail\ Archiver/Classes/Build\ Automation/entitlements.plist --deep -s " + DevID + " " + appPath)
'print "result 6: " + result
'check that signing went okay
result = DoShellCommand("spctl --verbose=4 --assess --type execute " + appPath)
'print result
if instr(result, "accepted") = 0 and instr(result, "changes being made to the file") = 0 then
print("Error with codesign")
end if
// Helper functions used within this script, contents may vary from packaging
Function shellEncode( inValue as string ) as string
Dim rvalue as string = replaceAll( inValue, " ", "\ " )
rvalue = replaceAll( rvalue, "&", "\&" )
rvalue = replaceAll( rvalue, "-", "\-" )
rvalue = replaceAll( rvalue, "(", "\(" )
rvalue = replaceAll( rvalue, ")", "\)" )
return rvalue
End Function
Das braucht noch eine Datei namens Entitlements.plist. Die habe ich irgendwann vom Forum heruntergeladen. DropDMG macht die Signierung der DMG-Datei. Notarisieren mache ich mit AppWrapper.
Kann es sein, das die Probleme seit dem 28.01.2021 auftreten? Das war der Zeitpunkt zu dem bei Apple ein zentrales Zertifikat (“AppleWWDRCAG3” - siehe WWDR Intermediate Certificate Expiration - Support - Apple Developer) ausgewechselt wurde - das muß man neu herunterladen und im Schlüsselbund hinterlegen.
Das Log von AppWrapper 4.1 wirft an dieser Stelle eine entsprechende Warnung aus, führt die Codesignierung aber auch mit einem veralteten Zertifikat durch.
Bislang habe ich alle meine Apps, sowohl die im Mac App Store als auch die, die über die Webseite bereitgestellt werden, sauber mit AppWrapper 3 bzw. 4 herstellen können.
Bin ich die einzige, die dieses Zertifikats-Gehopse grauenvoll findet? “Follow instructions below” hat keine Instruktionen. Wenn ich das Zertifikat herunterlade und doppelt klicke, bekomme ich eine wunderbare Fehlermeldung:
Ich hasse Zertifikate und Apple. Stackoverflow sagt:
Step 1: Open your Keychain Access app. Step 2: You will see list in left side as ‘Login’ ,‘System’ and ‘System Roots’, just drag your certificate in ‘Login’ option. Step 3: You will get certificate install successfully in Keychain Access.
AppleWWDRCAG3.cer - ausgeschrieben: Apple Worldwide Developer Relations Certification Authority - ist unter “Anmeldung > Zertifikate” zu finden, verfällt 2030…
Edit: Ist bei Dir schon im Schlüsselbund drin, ab Xcode 11.4.1 wird das ja automatisch mitinstalliert. Ich fahre unter Mojave ja noch das ältere Xcode 11.3 - da musste es von Hand nachinstalliert werden…
Erstmal danke, ja das Zertifikat musste aktualisiert werden. Ich habe das in den Xcode Einstellungen gemacht. Da hätte ich erwartet, dass das der AppWrapper entsprechend anzeigt. Wenn ich nun die App signiere, diese dann in ein Image packe (dmg) und dass dann auch noch signiere, sollte ein Customer dieses via Web laden können und bei sich ausführen können. Und das klappte noch bis Anfang/Mitte Januar. Ich teste das mit einem zweiten Rechner bei mir.
Hier mein Log der App Signierung. Sieht doch gut aus, oder? Ich habe das mit AppWrapper 4 gemacht und auch mit der Version 3 probiert.
Also in dem Log finde ich jetzt auf Anhieb auch nichts Auffälliges.
Wie genau äußert sich denn das Problem beim Kunden? Gibt es da einen CrashLog oder zumindest Konsolenmeldungen, anhand derer man das Problem einkreisen kann?
Oder gibt es eine Testversion mit der man es nachstellen kann?
Meine Anwendung erstellt in dem Start Ordner weitere Ordern und legt Dateien an.
Das Programm wird in der Regel in dem Ordner Dokument oder Desktop abgelegt. In den Einstellungen unter “Sicherheit” / “Dateien und Order” ist der kBetreuungsManager hinterlegt. Trotzdem kann dieser nicht schreiben.
Die Einstellungen in der Systemsteuerung decken nur einen geringen Teil der ganzen Zugriffsrechte ab. Vieles wird ja über entitlements geregelt. Insofern wäre da jetzt ein Blick in die entitlements sinnvoll.
Und die Meldungen, die im Konsolen Log auftauchen, da protokolliert das System ja, warum etwas nicht geht…
Über die Entitlements wird da nichts gemacht, da die App nicht im MAS ist. Das Schreiben sollte transparent funktionieren, nach der ersten Meldung “Darf die App auf den Schreibtisch zugreifen?”
@Klemens_Klarhoelter: Bitte beschreibe Dein Problem genauer. Was für eine Fehlermeldung gibt es? Wie sieht der Code aus? Tritt das Problem nur mit dem Schreibtisch auf oder auch bei anderen Ordnern?
Es ist eine gehärtete Runtime mit entitlements - selbstverständlich wertet das System die entitlements aus.
Ich glaube Du unterliegst da einem Irrtum, das nur Apps für den Mac App Store entitlements benötigen.
Jetzt habe ich gerade mal versucht die (Demo-/Basis-)Version von der Webseite zu laden, aber das DMG ist leider nicht zu öffnen. Fehlermeldung: "keine aktivierbaren Dateisysteme). Da scheint auch noch etwas im Argen zu liegen…