2. MAC
App-Store, Delphi und die Sandbox
Sandbox-Pflicht Containers Delphis
Sandbox-Funktionalität Mir ist das leider auch erst später bewusst geworden und die Apple-Reviewer sehen eben doch nicht alles. Meine Programme "CopyBackup" und "TEditor" unterstützen daher die volle Sandbox-Funktionalität jeweils erst ab der Version 3.01 bzw. 1.01. Berechtigungen
(Entitlements) Powerbox Wenn Sie das Programm beenden und es dann erneut starten, ist dieses Recht aber verwirkt, Sie müssten erneut den Öffnen-Dialog bemühen, um wieder Zugriff auf die Datei oder einen Ordner außerhalb der Sandbox zu erhalten. Hatten Sie die Datei innerhalb Ihrer Sandbox gespeichert, geht das allerdings auch so, Sie können in diesem Fall eine solche Datei direkt mit typischen ".Loadfromfile" Funktionen öffnen und laden. Sie werden aber oft die Situation haben, dass Sie Dateien bearbeiten, die in Ordnern liegen, die auch für andere Anwendungen zugänglich sein müssen, z.B. im Ordner Dokumente. Und dann wäre es schon praktisch, wenn Sie mit einer "Zuletzt bearbeitet" - Liste direkt auf eine Datei zugreifen können, ohne wieder den Datei Öffnen Dialog benutzen zu müssen. Persistenter
Zugriff auf Dateien und Ordner mit Bookmarks Allerdings ist dies leider gar nicht so einfach und bedauerlicherweise auch nicht mit den Komponenten TOpenDialog und TSaveDialog zu bewirken, die Delphi mitliefert. Denn man kann diese "Security Scoped Bookmarks" leider nur zu einem ganz bestimmten Zeitpunkt anlegen und das ist während der Lebensdauer eines Original MAC NSOpenPanels bzw. NSSavePanels. Zwar kapseln die Delphi-Komponenten die NSPanel-Objekte. Da aber nach der Rückkehr von den Execute-Funktionen im TOpenDialog bzw. TSaveDialog die NSPanels wieder zerstört sind, besteht hier leider keine Möglichkeit mehr, solche Bookmarks anzulegen. Man muss daher diese beiden Dialoge selber noch mal neu implementieren und dabei an der entscheidenden Stelle einen Aufruf der NSURL-Funktion "bookmarkDataWithOptions" vornehmen. Hier liegt der Zeitpunkt genau zwischen der Erzeugung des NSOpenPanels, der Auswahl der Datei und vor der Freigabe des Dialogs. Dann ist sozusagen die Tür einen Spalt offen und nur dann kann man die Bookmark anlegen. Diese Beschränkungen ergeben sich aus Überlegungen zur Sicherheit. Denn falls Ihre MAC-Anwendung mal von einem Virus befallen werden sollte, hat dieser selber keinen Zugriff auf Ressourcen außerhalb der Sandbox und kann dort keinen Schaden anstellen. Bei dem NSSavePanel wird es leider noch komplizierter. Denn die Bookmarks werden an tatsächlich bestehende Ordner oder Dateien gebunden. Was also machen, wenn Sie eine Textliste erst nur im Arbeitsspeicher haben und eine Bookmark anfordern wollen für eine Datei, die noch nicht existiert? Man muss - wieder an der entscheidenden Stelle - während der Lebenszeit des NSSavePanels eine Datei mit dem gewünschten Namen temporär erzeugen (das kann auch eine leere Datei sein) und dann dafür die Bookmark anlegen. Nach Rückkehr vom NSSavePanel-Dialog können Sie dann die Datei mit den von Ihnen gewünschten Inhalten füllen. Der Aufruf der Funktion zur Erzeugung der Bookmark sieht so aus: function CreateAppScopedBookMark (var data: NSDATA; URL: Data, ein NSData-Objekt enthält dann die Bookmark, die man dann z.B. in einer Datei speichern und später wieder laden kann, um die Sandbox damit wieder zu öffnen. Dieses spätere Öffnen erfolgt im ersten Schritt mit der NSURL-CLASS Funktion "URLByResolvingBookmarkData". NSURL und NSURLCLASS sind übrigens in der Unit MACApi.Foundation.pas implementiert, diese Unit müssen Sie also in Ihr Projekt einbinden. Damit ist es aber noch nicht getan. Sie müssen zunächst startAccessingSecurityScopedResource
aufrufen stopAccessingSecurityScopedResource Zu allem Übel der sich hier andeutenden Komplexität wurden im NSURL-Interface, das in der MACApi.Foundation.pas implementiert ist, leider nicht die beiden zuletzt genannten Funktionen integriert. Man muss diese also selber in einer eigenen Interface-Implementation integrieren. Ich habe mit der Quality-Central Meldung Report #: 113852 darauf hingewiesen und gebeten, dass dies in einem der nächsten Updates nachgeholt wird. Denn nicht jeder weiß wie man das macht und selbst dann verkompliziert es die Programmlogik nur unnötig. |
Die
HSW.FMXSandbox.pas unit Im aktuellen e-Book existiert bereits ein allgemeiner Abschnitt zum Sandboxing, wo unter anderem noch eine andere Möglichkeit zum Zugriff auf Ressourcen außerhalb der Sandbox beschrieben wird. In der 16. Auflage des e-Books, das am 22.03.2013 erscheinen wird, ist der Inhalt dieses Blogs sehr viel ausführlicher geschildert und vor allem ist im Anhang meine HSW.FMXSandbox.pas unit abgedruckt, die Sie als Leser des e-Books frei verwenden können. Dort sind nicht nur die ganzen MACApi.Foundation Funktionen in die Delphi Notation umgesetzt, sondern es werden auch fehlende Integerkonstanten (z.B. NSURLBookmarkCreationWithSecurityScope) ergänzt und auch die Implementierung der fehlenden start und stop NSURL-Funktionen wird nachgeholt. Schließlich wurde die ganze Verwaltung des Anlegens, Speicherns und Wiederaufrufen der Bookmarks integriert und automatisiert, so dass nur noch 2 kurze Funktionsaufrufe erforderlich sind, um die Ressourcen anzufordern und wieder freizugeben. Und zu guter letzt haben Sie Zugriff auf meine Implementierung der erweiterten Öffnen und Sichern-Dialoge, die es Ihnen überhaupt erst ermöglichen, die Bookmarks anzulegen. |
Also, was ist Ihre Meinung zum Sandboxing mit Delphi, wie sind Ihre eigenen Erfahrungen? Wenn Sie Anregungen zu Themen haben, lassen Sie es mich gerne wissen. Meine Mailadresse finden Sie oben auf der Seite unter dem Link "Anbieterkennzeichnung & Kontakt". Über meinen Hastasoft-Twitter Account werde ich posten, wenn neue Blogbeiträge zur Verfügung stehen. Wenn Sie wollen, klinken Sie sich dort ein (siehe meine Hastasoft-Seite). Der nächste Blogbeitrag wird sich mit Objective C und Cocoa befassen und grob erläutern, was da eigentlich hinter steckt und wie Sie die dahinter stehende Funktionalität in Ihre Delphi-Programme holen. Viel Erfolg mit Delphi und FireMonkey! Harry Stahl, 20.03.2013 |