Scriptable Tutorial Teil 2 – Dateien

Von | 08.11.2020

Im ersten Teil des Tutorials haben wir uns angesehen, wie mit Scriptable ein iOS-Widget erstellt werden kann. In diesem Tutorial soll es nun um das Thema Persistenz gehen. Wie ist vorzugehen, wenn ein Script Daten zwischenspeichern muss?

Scriptable erlaubt Euch leider keinen einfachen Zugriff auf Datenbanken oder Propertyspeicher. Technologien, die Ihr vielleicht aus dem Web kennt, können in Scriptable also nicht verwendet werden. Glücklicherweise gibt es einen leichten Ausweg. Ihr könnt mittels der Scriptable-API Dateien im Dateisystem des Smartphones erzeugen, diese Dateien bleiben auch nach dem Ausführen eines Scripts erhalten und können so beim nächsten Scriptlauf wieder eingelesen werden.

Die Beispielapplikation – Instagram Followers v2

Im ersten Teil dieses Turorials haben wir ein Widget erstellt, welches die aktuelle Anzahl an Followern zu einem Instagram-Account anzeigt. Dieses wollen wir nun im zweiten Teil des Tutorials erweitern. Zusätzlich zur aktuellen Anzahl an Followern soll die Steigerung der Follower zu gestern, letzter Woche und letztem Monat dargestellt werden. So wird das Endergebnis am Ende aussehen:

Das Endergebnis dieses Tutorials
Verwendete API’s

Im Vergleich zum ersten Tutorial benötigen wir nur eine weitere Klasse aus der Scriptable API:

  • FileManager: Klasse, welche sämtliche Methoden zum Lesen und Schreiben des Dateisystems bereitstellt.
Auszüge aus dem Code

Der FileManager stellt zwei unterschiedliche Methoden zur Verfügung, um auf das Dateisystem zuzugreifen:

  • .local: Erstellt eine Datei im lokalen Dateisystem im Kontext der Scriptable App
  • .iCloud: Erstellt eine Datei im iCloud-Berech der Scriptable App

Beide Methoden geben eine Instanz des FileManagers zurück, mit welcher dann im Folgenden weitergearbeitet werden kann. Wir werden im Folgenen mit der iCloud-Variante arbeiten. Dies hat den charmanten Vorteil, dass wir über den PC direkt die vom Widget erstellten Dateien überprüfen können, sofern wir von diesem Zugriff auf die iCloud haben. Bei einer Dateiablage im lokalen Dateisystem des Smartphones wäre dies nicht ohne weiteres möglich.

Das Einlesen bzw. Schreiben von Dateien funktioniert für beide Varianten vollkommen identisch, es gibt nur eine Ausnahme. Soll auf eine Datei aus der iCloud zugegriffen werden, kann es sein, dass diese lokal noch nicht vorhanden ist. In diesem Fall muss die Datei erst aus der iCloud heruntergeladen werden. Dies geschieht über die Methode

  • downloadFileFromiCloud: Übergeben werden muss hier mindestens ein Dateiname oder auch der Pfad zu einer Datei.

Sofern Ihr das Widget nur auf einem Endgerät nutzt, ist nach der Anlage sichergestellt, dass die Datei lokal und in der iCloud vorhanden ist. Würdet Ihr aber mit zwei Smartphones das Widget betreiben, wäre die Datei auf dem zweiten Smartphone nicht sofort vorhanden und ein downloadFileFromiCloud wäre vor dem ersten Zugriff erforderlich.

Wie legt man nun eine neue Datei an? Zunächst einmal wollen wir die Followerstatistik nicht direkt im Hauptverzeichnis von Scriptable ablegen, sondern für unser Widget ein eigenes Unterverzeichnis nutzen. Dieses Verzeichnis wird wie folgt angelegt:

let dir = fm.documentsDirectory();
var path = fm.joinPath(dir, "insta/");
if (!fm.fileExists(path)) {
   fm.createDirectory(path, false);
}

Folgende Methoden des Filemanagers werden verwendet:

  • .documentsDirectory: Gibt den Pfad der Scriptable App zurück.
  • .joinPath: Methode, um den Pfad um eigene Verzeichnisse zu ergänzen.
  • .fileExists: Prüft, ob ein Verzeichnis oder eine Datei bereits existiert.
  • .createDirectory: Legt ein Verzeichnis an.

Nachdem wir nun einen Speicherort haben, müssen wir in diesem nur noch eine Datei anlegen. Dies geschieht wie folgt:

path += accountName + ".json";
fm.writeString(path, JSON.stringify(followers));

Zunächst ergänzen wir in diesem Beispiel den verwendeten Pfad noch um einen Dateinamen. Für unser Widget verwenden wir den Namen des Instagram Accounts. Theoretisch könnte das Widget auf einem Endgerät für mehr als einen Account eingerichtet werden. Durch die Verwendung des Dateinamens wird sichergestellt, dass sich die verschiedenen Wigets nicht gegenseitig die Daten überschreiben.

Wichtig: .writeString erzeugt die Datei, die zu beschreiben ist. Falls die Datei bereits vorhanden ist, wird diese überschrieben!

Lesen können wir die Datei analog dem schreibenden Zugriff wie folgt:

var jsonString = fm.readString(path);

Vor dem Lesen der Datei sollte immer mit .fileExists geprüft werden, ob die Datei auch wirklich existiert, da ansonsten eine Exception auftreten wird.

Das restliche Handwerk

Nachdem nun die Grundlagen zum Lesen und Schreiben von Dateien vorhanden sind, hier nur ein kurzer Abriss über das Erfassen der Statistiken.

Jede erfasste Followerzahl wird mit Timestamp in einem Datenobjekt abgelegt. Dieses Datenobjekt wird bei Beendigung des Widgets als JSON in eine Datei weggespeichert und beim Start des Widgets dann entsprechend wieder eingelesen. So wächst über die Zeit der verfügbare Datenstamm an Followerdaten an. Hieraus folgt natürlich auch, dass beim ersten Start des Widgets noch keine Veränderung zum Vortag angezeigt werden kann, dies wird dann erst am Folgetag klappen. Gleiches gilt natürlich auch die wöchentliche und monatliche Statistik, die erst mit entsprechender Zeitverzögerung verfügbar sein werden.

Zum Abschluss

Sollte Euch mein kleines Scriptable Tutorial gefallen haben, würde ich mich über einen kleinen Einwurf in die Kaffeekasse freuen:

https://www.paypal.com/paypalme/markmescher/2,99

Wie groß der Kaffee werden soll, dürft Ihr natürlich frei entscheiden 🙂

Den vollständigen Programmcode findet Ihr hier:

https://github.com/bestmacfly/Sriptable-Instagram-Follower-Widget

Solltet Ihr Anregungen zu diesem Tutorial haben, freue ich mich über Eure Kommentare!

Weiter geht es mit dem Tutorial direkt im dritten Teil, sprecht mit Siri:

Scriptable Tutorial Teil 3 – Hey Siri

Auch hier noch einmal der Hinweis auf weitere sinnvolle Informationsquellen:

https://www.scriptables.de

Auf dieser Seite findet Ihr unzählige Beispielscripte, die Ihr direkt nutzen und als Anregung verwenden könnt.

Für Fragen aller Art bietet sich folgende Seite an:

https://talk.automators.fm/

Es lassen sich auch hier hunderte Beispiele finden, die nur darauf warten, ausprobiert zu werden. Auch wird Euch hier gerne bei Problemen weitergeholfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..