Dateisystemzugriff in Xamarin.iOS

Download Sample Das Beispiel herunterladen

Sie können Xamarin.iOS und die System.IO Klassen in der .NET-Basisklassenbibliothek (BCL) verwenden, um auf das iOS-Dateisystem zuzugreifen. Mithilfe der File-Klasse können Sie Dateien erstellen, löschen und lesen, und mit der Directory-Klasse können Sie den Inhalt der Verzeichnisse erstellen, löschen oder auflisten. Sie können auch Unterklassen verwenden Stream , die ein größeres Maß an Kontrolle über Dateivorgänge (z. B. Komprimierung oder Positionssuche innerhalb einer Datei) bieten können.

iOS erzwingt einige Einschränkungen dafür, was eine Anwendung mit dem Dateisystem tun kann, um die Sicherheit der Daten einer Anwendung zu wahren und Benutzer vor bösartigen Apps zu schützen. Diese Einschränkungen sind Teil der Anwendungs-Sandbox – eine Reihe von Regeln, die den Zugriff einer Anwendung auf Dateien, Einstellungen, Netzwerkressourcen, Hardware usw. einschränken. Eine Anwendung ist auf das Lesen und Schreiben von Dateien innerhalb des Startverzeichnisses (installierter Speicherort) beschränkt. sie kann nicht auf die Dateien einer anderen Anwendung zugreifen.

iOS verfügt auch über einige dateisystemspezifische Features: Bestimmte Verzeichnisse erfordern eine besondere Behandlung in Bezug auf Sicherungen und Upgrades, und Anwendungen können dateien auch miteinander teilen und die Dateien-App (seit iOS 11) und über iTunes.

In diesem Artikel werden die Features und Einschränkungen des iOS-Dateisystems und eine Beispielanwendung erläutert, die veranschaulicht, wie Sie Xamarin.iOS verwenden, um einige einfache Dateisystemvorgänge auszuführen:

A sample of iOS executing some simple file system operations

Allgemeiner Dateizugriff

Mit Xamarin.iOS können Sie die .NET-Klassen System.IO für Dateisystemvorgänge unter iOS verwenden.

Die folgenden Codeausschnitte veranschaulichen einige allgemeine Dateivorgänge. Sie finden sie alle unten in der SampleCode.cs-Datei in der Beispielanwendung für diesen Artikel.

Verwenden von Verzeichnissen

Dieser Code listet die Unterverzeichnisse im aktuellen Verzeichnis auf (angegeben durch den Parameter "./"), der speicherort der ausführbaren Anwendung ist. Ihre Ausgabe ist eine Liste aller Dateien und Ordner, die mit Ihrer Anwendung bereitgestellt werden (während des Debuggens im Konsolenfenster angezeigt).

var directories = Directory.EnumerateDirectories("./");
foreach (var directory in directories) {
      Console.WriteLine(directory);
}

Lesen von Dateien

Zum Lesen einer Textdatei benötigen Sie nur eine einzige Codezeile. In diesem Beispiel wird der Inhalt einer Textdatei im Fenster "Anwendungsausgabe" angezeigt.

var text = File.ReadAllText("TestData/ReadMe.txt");
Console.WriteLine(text);

XML-Serialisierung

Obwohl die Arbeit mit dem vollständigen System.Xml Namespace über den Umfang dieses Artikels hinausgeht, können Sie ein XML-Dokument problemlos aus dem Dateisystem mithilfe eines StreamReader wie diesem Codeausschnitt deserialisieren:

using (TextReader reader = new StreamReader("./TestData/test.xml")) {
      XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
      var xml = (MyObject)serializer.Deserialize(reader);
}

Weitere Informationen finden Sie in der Dokumentation für System.Xml und Serialisierung. In der Xamarin.iOS-Dokumentation finden Sie im Linker – häufig müssen Sie das [Preserve] Attribut zu Klassen hinzufügen, die Sie serialisieren möchten.

Erstellen von Dateien und Verzeichnissen

In diesem Beispiel wird gezeigt, wie Sie mithilfe der Environment Klasse auf den Ordner "Dokumente" zugreifen können, in dem Dateien und Verzeichnisse erstellt werden können.

var documents =
 Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments); 
var filename = Path.Combine (documents, "Write.txt");
File.WriteAllText(filename, "Write this text into a file");

Das Erstellen eines Verzeichnisses ist ein ähnlicher Prozess:

var documents =
 Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var directoryname = Path.Combine (documents, "NewDirectory");
Directory.CreateDirectory(directoryname);

Weitere Informationen finden Sie in der System.IO-API-Referenz.

Serialisieren von JSON

Json.NET ist ein leistungsstarkes JSON-Framework, das mit Xamarin.iOS arbeitet und auf NuGet verfügbar ist. Fügen Sie das NuGet-Paket zu Ihrem Anwendungsprojekt hinzu, indem Sie NuGet in Visual Studio für Mac hinzufügen:

Adding the NuGet package to the applications project

Fügen Sie als Nächstes eine Klasse hinzu, die als Datenmodell für die Serialisierung/Deserialisierung fungiert (in diesem Fall Account.cs):

using System;
using System.Collections.Generic;
using Foundation; // for Preserve attribute, which helps serialization with Linking enabled

namespace FileSystem
{
    [Preserve]
    public class Account
    {
        public string Email { get; set; }
        public bool Active { get; set; }
        public DateTime CreatedDate { get; set; }
        public List<string> Roles { get; set; }

        public Account() {
        }
    }
}

Erstellen Sie schließlich eine Instanz der Account Klasse, serialisieren Sie sie in JSON-Daten, und schreiben Sie sie in eine Datei:

// Create a new record
var account = new Account(){
    Email = "monkey@xamarin.com",
    Active = true,
    CreatedDate = new DateTime(2015, 5, 27, 0, 0, 0, DateTimeKind.Utc),
    Roles = new List<string> {"User", "Admin"}
};

// Serialize object
var json = JsonConvert.SerializeObject(account, Newtonsoft.Json.Formatting.Indented);

// Save to file
var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine (documents, "account.json");
File.WriteAllText(filename, json);

Weitere Informationen zum Arbeiten mit JSON-Daten in einer .NET-Anwendung finden Sie in der Dokumentation zu Json.NET.

Besondere Überlegungen

Trotz der Ähnlichkeiten zwischen Xamarin.iOS- und .NET-Dateivorgängen unterscheiden sich iOS und Xamarin.iOS auf einige wichtige Weise von .NET.

Erstellen barrierefreier Projektdateien zur Laufzeit

Wenn Sie ihrem Projekt eine Datei hinzufügen, wird sie standardmäßig nicht in der endgültigen Assembly enthalten und steht daher nicht für Ihre Anwendung zur Verfügung. Um eine Datei in die Assembly einzuschließen, müssen Sie sie mit einer speziellen Buildaktion markieren, die als "Inhalt" bezeichnet wird.

Wenn Sie eine Datei für die Aufnahme markieren möchten, klicken Sie mit der rechten Maustaste auf die Datei(n), und wählen Sie "Aktionsinhalt > erstellen" in Visual Studio für Mac aus. Sie können auch die Buildaktion im Eigenschaftenblatt der Datei ändern.

Groß- und Kleinschreibung

Es ist wichtig zu verstehen, dass bei dem iOS-Dateisystem die Groß-/Kleinschreibung beachtet wird. Die Groß-/Kleinschreibung bedeutet, dass Die Dateinamen und Verzeichnisnamen exakt übereinstimmen müssen – README.txt und readme.txt würden als unterschiedliche Dateinamen betrachtet.

Dies könnte für .NET-Entwickler verwirrend sein, die mit dem Windows-Dateisystem vertrauter sind, bei dem die Groß-/Kleinschreibung nicht beachtet wirdDateien, DATEIEN und Dateien verweisen alle auf dasselbe Verzeichnis.

Warnung

Bei dem iOS-Simulator wird die Groß-/Kleinschreibung nicht beachtet. Wenn sich die Groß-/Kleinschreibung zwischen der Datei selbst und den Verweisen auf die Datei im Code unterscheidet, funktioniert ihr Code möglicherweise weiterhin im Simulator, schlägt jedoch auf einem echten Gerät fehl. Dies ist einer der Gründe, warum es wichtig ist, frühzeitig und häufig während der iOS-Entwicklung auf einem tatsächlichen Gerät bereitzustellen und zu testen.

Pfadtrennzeichen

iOS verwendet den Schrägstrich "/" als Pfadtrennzeichen (das sich von Windows unterscheidet, bei dem der umgekehrte Schrägstrich "\" verwendet wird).

Aufgrund dieses verwirrenden Unterschieds empfiehlt es sich, die System.IO.Path.Combine Methode zu verwenden, die sich für die aktuelle Plattform anpasst, anstatt ein bestimmtes Pfadtrennzeichen zu hartcodieren. Dies ist ein einfacher Schritt, mit dem Ihr Code für andere Plattformen portierbarer wird.

Anwendungs-Sandbox

Der Zugriff Ihrer Anwendung auf das Dateisystem (und andere Ressourcen wie netzwerk- und Hardwarefeatures) ist aus Sicherheitsgründen eingeschränkt. Diese Einschränkung wird als Application Sandbox bezeichnet. Im Hinblick auf das Dateisystem ist Ihre Anwendung auf das Erstellen und Löschen von Dateien und Verzeichnissen in seinem Startverzeichnis beschränkt.

Das Startverzeichnis ist ein eindeutiger Speicherort im Dateisystem, an dem Ihre Anwendung und alle zugehörigen Daten gespeichert werden. Sie können den Speicherort des Startverzeichnisses für Ihre Anwendung nicht auswählen (oder ändern). iOS und Xamarin.iOS bieten jedoch Eigenschaften und Methoden zum Verwalten der Dateien und Verzeichnisse innerhalb.

Das Anwendungsbundle

Das Anwendungsbundle ist der Ordner, der Ihre Anwendung enthält. Sie unterscheidet sich von anderen Ordnern, indem das .app Suffix dem Verzeichnisnamen hinzugefügt wurde. Ihr Anwendungsbundle enthält Ihre ausführbare Datei und alle Inhalte (Dateien, Bilder usw.), die für Ihr Projekt erforderlich sind.

Wenn Sie in Mac OS zu Ihrem Anwendungspaket navigieren, wird es mit einem anderen Symbol angezeigt als in anderen Verzeichnissen (und das .app Suffix ist ausgeblendet). Es handelt sich jedoch nur um ein normales Verzeichnis, das vom Betriebssystem anders angezeigt wird.

Um das Anwendungsbundle für den Beispielcode anzuzeigen, klicken Sie in Visual Studio für Mac mit der rechten Maustaste auf das Projekt, und wählen Sie "In Finder anzeigen" aus. Navigieren Sie dann zum Bin/ Verzeichnis, in dem Sie ein Anwendungssymbol finden sollten (ähnlich wie im folgenden Screenshot).

Navigate through the bin directory to find an application icon similar to this screenshot

Klicken Sie mit der rechten Maustaste auf dieses Symbol, und wählen Sie " Paketinhalte anzeigen" aus, um den Inhalt des Anwendungspaketverzeichnisses zu durchsuchen. Der Inhalt wird genau wie der Inhalt eines regulären Verzeichnisses angezeigt, wie hier gezeigt:

The contents of the app bundle

Das Anwendungsbundle ist das, was während des Tests auf dem Simulator oder auf Ihrem Gerät installiert ist, und letztendlich wird es an Apple zur Aufnahme in den App Store übermittelt.

Anwendungsverzeichnisse

Wenn Ihre Anwendung auf einem Gerät installiert ist, erstellt das Betriebssystem ein Startverzeichnis für Ihre Anwendung und erstellt eine Reihe von Verzeichnissen innerhalb des Anwendungsstammverzeichnisses, die zur Verwendung verfügbar sind. Seit iOS 8 befinden sich die vom Benutzer zugänglichen Verzeichnisse NICHT im Anwendungsstamm, sodass Sie die Pfade für das Anwendungsbundle nicht aus den Benutzerverzeichnissen ableiten können oder umgekehrt.

In diesen Verzeichnissen wird beschrieben, wie sie ihren Pfad bestimmen und deren Zwecke nachfolgend aufgeführt sind:

 

Verzeichnis Beschreibung
[ApplicationName].app/ In iOS 7 und früheren Versionen ist dies das ApplicationBundle Verzeichnis, in dem Ihre Anwendung ausführbar ist. Die Verzeichnisstruktur, die Sie in Ihrer App erstellen, ist in diesem Verzeichnis vorhanden (z. B. Bilder und andere Dateitypen, die Sie in Ihrem Visual Studio für Mac Projekt als Ressourcen markiert haben).

Wenn Sie auf die Inhaltsdateien in Ihrem Anwendungsbundle zugreifen müssen, ist der Pfad zu diesem Verzeichnis über die NSBundle.MainBundle.BundlePath Eigenschaft verfügbar.
Dokumente/ Verwenden Sie dieses Verzeichnis, um Benutzerdokumente und Anwendungsdatendateien zu speichern.

Der Inhalt dieses Verzeichnisses kann dem Benutzer über die iTunes-Dateifreigabe zur Verfügung gestellt werden (obwohl dies standardmäßig deaktiviert ist). Fügen Sie der Info.plist-Datei einen UIFileSharingEnabled booleschen Schlüssel hinzu, damit Benutzer auf diese Dateien zugreifen können.

Auch wenn eine Anwendung die Dateifreigabe nicht sofort aktiviert, sollten Sie verhindern, dass Dateien, die von Ihren Benutzern in diesem Verzeichnis ausgeblendet werden sollen (z. B. Datenbankdateien, es sei denn, Sie möchten sie freigeben). Solange vertrauliche Dateien wieder Standard ausgeblendet sind, werden diese Dateien nicht verfügbar gemacht (und möglicherweise von iTunes verschoben, geändert oder gelöscht), wenn die Dateifreigabe in einer zukünftigen Version aktiviert ist.

Mit der Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) Methode können Sie den Pfad zum Verzeichnis "Dokumente" für Ihre Anwendung abrufen.

Die Inhalte dieses Verzeichnisses werden von iTunes gesichert.
Bibliothek/ Das Bibliotheksverzeichnis ist ein guter Ort zum Speichern von Dateien, die nicht direkt vom Benutzer erstellt werden, z. B. Datenbanken oder andere anwendungsgenerierte Dateien. Die Inhalte dieses Verzeichnisses werden niemals über iTunes für den Benutzer verfügbar gemacht.

Sie können eigene Unterverzeichnisse in "Library" erstellen; Es gibt jedoch bereits einige vom System erstellte Verzeichnisse, die Sie kennen sollten, einschließlich Einstellungen und Caches.

Der Inhalt dieses Verzeichnisses (mit Ausnahme des Unterverzeichnisses "Caches") wird von iTunes gesichert. Benutzerdefinierte Verzeichnisse, die Sie in "Bibliothek" erstellen, werden gesichert.
Bibliothek/Einstellungen/ Anwendungsspezifische Einstellungsdateien werden in diesem Verzeichnis gespeichert. Erstellen Sie diese Dateien nicht direkt. Verwenden Sie stattdessen die NSUserDefaults Klasse.

Die Inhalte dieses Verzeichnisses werden von iTunes gesichert.
Bibliothek/Caches/ Das Caches-Verzeichnis ist ein guter Ort zum Speichern von Datendateien, die ihrer Anwendung beim Ausführen helfen können, das kann jedoch problemlos neu erstellt werden. Die Anwendung sollte diese Dateien nach Bedarf erstellen und löschen und diese ggf. erneut erstellen können. iOS 5 kann diese Dateien auch löschen (unter geringen Speichersituationen), dies geschieht jedoch nicht, während die Anwendung ausgeführt wird.

Die Inhalte dieses Verzeichnisses werden nicht von iTunes gesichert, was bedeutet, dass sie nicht vorhanden sind, wenn der Benutzer ein Gerät wiederhergestellt, und er ist möglicherweise nicht vorhanden, nachdem eine aktualisierte Version Ihrer Anwendung installiert wurde.

Wenn Ihre Anwendung beispielsweise keine Verbindung mit dem Netzwerk herstellen kann, können Sie das Caches-Verzeichnis verwenden, um Daten oder Dateien zu speichern, um eine gute Offlineumgebung zu bieten. Die Anwendung kann diese Daten während des Wartens auf Netzwerkantworten schnell speichern und abrufen, muss aber nicht gesichert werden und kann nach einer Wiederherstellung oder Versionsaktualisierung problemlos wiederhergestellt oder neu erstellt werden.
Tmp/ Anwendungen können temporäre Dateien speichern, die nur für einen kurzen Zeitraum in diesem Verzeichnis benötigt werden. Um Speicherplatz zu sparen, sollten Dateien gelöscht werden, wenn sie nicht mehr benötigt werden. Das Betriebssystem kann dateien auch aus diesem Verzeichnis löschen, wenn eine Anwendung nicht ausgeführt wird.

Die Inhalte dieses Verzeichnisses werden nicht von iTunes gesichert.

Beispielsweise kann das tmp-Verzeichnis verwendet werden, um temporäre Dateien zu speichern, die für die Anzeige für den Benutzer heruntergeladen werden (z. B. Twitter-Avatare oder E-Mail-Anlagen), die jedoch gelöscht werden können, nachdem sie angezeigt (und erneut heruntergeladen wurden, wenn sie in zukunft erforderlich sind).

Dieser Screenshot zeigt die Verzeichnisstruktur in einem Finder-Fenster:

This screenshot shows the directory structure in a Finder window

Programmgesteuertes Zugreifen auf andere Verzeichnisse

Auf das Verzeichnis und die Documents Dateibeispiele der früheren Verzeichnis- und Dateibeispiele wurde zugegriffen. Um in ein anderes Verzeichnis zu schreiben, müssen Sie einen Pfad mit der Syntax "." erstellen, wie hier gezeigt:

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var library = Path.Combine (documents, "..", "Library");
var filename = Path.Combine (library, "WriteToLibrary.txt");
File.WriteAllText(filename, "Write this text into a file in Library");

Das Erstellen eines Verzeichnisses ist ähnlich:

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var library = Path.Combine (documents, "..", "Library");
var directoryname = Path.Combine (library, "NewLibraryDirectory");
Directory.CreateDirectory(directoryname);

Pfade zu den Caches Verzeichnissen und tmp Verzeichnissen können wie folgt erstellt werden:

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var cache = Path.Combine (documents, "..", "Library", "Caches");
var tmp = Path.Combine (documents, "..", "tmp");

Freigeben mit der Datei-App

iOS 11 hat die Dateien-App eingeführt – ein Dateibrowser für iOS, mit dem der Benutzer seine Dateien in iCloud anzeigen und interagieren kann und auch von jeder Anwendung gespeichert wird, die sie unterstützt. Um dem Benutzer den direkten Zugriff auf Dateien in Ihrer App zu ermöglichen, erstellen Sie einen neuen booleschen Schlüssel in der Datei LSSupportsOpeningDocumentsInPlace Info.plist, und legen Sie ihn wie folgt festtrue:

Set LSSupportsOpeningDocumentsInPlace in Info.plist

Das Dokumentverzeichnis der App ist jetzt für das Durchsuchen in der Datei-App verfügbar. Navigieren Sie in der Dateien-App zu "Auf meinem i Telefon und jede App mit freigegebenen Dateien wird angezeigt. Die folgenden Screenshots zeigen, wie die FileSystem-Beispiel-App aussieht:

iOS 11 Files appBrowse my iPhone filesSample app files

Freigeben von Dateien für den Benutzer über iTunes

Benutzer können auf die Dateien im Verzeichnis "Dokumente" Ihrer Anwendung zugreifen, indem Sie eine Anwendung bearbeiten Info.plist und erstellen, die den iTunes-Freigabeeintrag (UIFileSharingEnabled) in der Quellansicht unterstützt, wie hier gezeigt:

Adding the Application supports iTunes sharing property

Auf diese Dateien kann in iTunes zugegriffen werden, wenn das Gerät verbunden ist und der Benutzer die Apps Registerkarte auswäht. Der folgende Screenshot zeigt beispielsweise die Dateien in der ausgewählten App, die über iTunes freigegeben wurden:

This screenshot shows the files in selected app shared via iTunes

Benutzer können nur über iTunes auf die Elemente der obersten Ebene in diesem Verzeichnis zugreifen. Sie können den Inhalt aller Unterverzeichnisse nicht sehen (obwohl sie sie auf ihren Computer kopieren oder löschen können). Beispielsweise können PDF- und EPUB-Dateien mit GoodReader für die Anwendung freigegeben werden, damit Benutzer sie auf ihren iOS-Geräten lesen können.

Benutzer, die den Inhalt ihres Ordners "Dokumente" ändern, können Probleme verursachen, wenn sie nicht vorsichtig sind. Ihre Anwendung sollte dies berücksichtigen und widerstandsfähig gegen destruktive Aktualisierungen des Ordners "Dokumente" sein.

Der Beispielcode für diesen Artikel erstellt sowohl eine Datei als auch einen Ordner im Ordner "Dokumente" (in SampleCode.cs) und ermöglicht die Dateifreigabe in der Info.plist-Datei . Dieser Screenshot zeigt, wie diese in iTunes angezeigt werden:

This screenshot shows how the files appear in iTunes

Informationen zum Festlegen von Symbolen für die Anwendung und für alle benutzerdefinierten Dokumenttypen, die Sie erstellen, finden Sie im Artikel "Arbeiten mit Bildern ".

Wenn der UIFileSharingEnabled Schlüssel falsch ist oder nicht vorhanden ist, ist die Dateifreigabe standardmäßig deaktiviert, und Benutzer können nicht mit Ihrem Dokumentverzeichnis interagieren.

Sichern und Wiederherstellen

Wenn ein Gerät von iTunes gesichert wird, werden alle verzeichnisse, die im Startverzeichnis Ihrer Anwendung erstellt wurden, mit Ausnahme der folgenden Verzeichnisse gespeichert:

  • [ApplicationName].app – Schreiben Sie nicht in dieses Verzeichnis, da es signiert ist und muss daher nach der Installation unverändert sein Standard. Es kann Ressourcen enthalten, auf die Sie über Ihren Code zugreifen, aber sie erfordern keine Sicherung, da sie durch erneutes Herunterladen der App wiederhergestellt werden.
  • Bibliothek/Caches – Das Cacheverzeichnis ist für Arbeitsdateien vorgesehen, die nicht gesichert werden müssen.
  • tmp – Dieses Verzeichnis wird für temporäre Dateien verwendet, die erstellt und gelöscht werden, wenn sie nicht mehr benötigt werden, oder für Dateien, die iOS löscht, wenn sie Speicherplatz benötigt.

Das Sichern einer großen Datenmenge kann eine lange Zeit dauern. Wenn Sie sich entscheiden, ein bestimmtes Dokument oder bestimmte Daten zu sichern, sollte Ihre Anwendung entweder die Ordner "Dokumente" und "Bibliothek" verwenden. Verwenden Sie für vorübergehende Daten oder Dateien, die einfach aus dem Netzwerk abgerufen werden können, entweder die Caches oder das tmp-Verzeichnis.

Hinweis

iOS sauber das Dateisystem, wenn ein Gerät kritisch wenig Speicherplatz auf dem Datenträger ausführt. Bei diesem Vorgang werden alle Dateien aus dem Ordner "Bibliothek/Caches" und "tmp" von Anwendungen entfernt, die derzeit nicht ausgeführt werden.

Einhaltung von iOS 5 iCloud-Sicherungseinschränkungen

Hinweis

Obwohl diese Richtlinie erstmals mit iOS 5 eingeführt wurde (vor langer Zeit scheint), ist die Anleitung für Apps heute noch relevant.

Apple hat iCloud Backup-Funktionen mit iOS 5 eingeführt. Wenn iCloud Backup aktiviert ist, werden alle Dateien im Startverzeichnis Ihrer Anwendung (mit Ausnahme von Verzeichnissen, die normalerweise nicht gesichert werden, z. B. das App-Bündel Cachesund tmp) auf iCloud-Servern gesichert. Dieses Feature bietet dem Benutzer eine vollständige Sicherung, falls sein Gerät verloren geht, gestohlen oder beschädigt wird.

Da iCloud nur 5 GB freien Speicherplatz für jeden Benutzer bereitstellt und nicht unnötig Bandbreite nutzt, erwartet Apple, dass Anwendungen nur wesentliche vom Benutzer generierte Daten sichern. Um die iOS-Datenspeicherrichtlinien einzuhalten, sollten Sie die Datenmenge einschränken, die durch Einhaltung der folgenden Elemente gesichert wird:

  • Speichern Sie nur vom Benutzer generierte Daten oder Daten, die andernfalls nicht erneut erstellt werden können, im Verzeichnis "Dokumente" (gesichert).
  • Speichern Sie alle anderen Daten, die einfach neu erstellt oder erneut heruntergeladen Library/Caches werden können oder tmp (was nicht gesichert ist und "sauber" sein könnte).
  • Wenn Sie Dateien haben, die möglicherweise für den Library/Caches Ordner tmp geeignet sind, aber nicht "sauber" sind, speichern Sie sie an anderer Stelle (zLibrary/YourData. B. ) und wenden Sie das Attribut "Nicht sichern" an, um zu verhindern, dass die Dateien iCloud Backup-Bandbreite und Speicherplatz belegen. Diese Daten verwenden weiterhin Speicherplatz auf dem Gerät, daher sollten Sie sie sorgfältig verwalten und nach Möglichkeit löschen.

Das Attribut "Do not back up" wird mithilfe der NSFileManager Klasse festgelegt. Stellen Sie sicher, dass Ihr Kurs wie folgt aussiehtusing Foundation:SetSkipBackupAttribute

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine (documents, "LocalOnly.txt");
File.WriteAllText(filename, "This file will never get backed-up. It would need to be re-created after a restore or re-install");
NSFileManager.SetSkipBackupAttribute (filename, true); // backup will be skipped for this file

true Wenn SetSkipBackupAttribute die Datei nicht gesichert wird, unabhängig vom Verzeichnis, in dem sie gespeichert ist (auch im Documents Verzeichnis). Sie können das Attribut mithilfe der GetSkipBackupAttribute Methode abfragen und sie zurücksetzen, indem Sie die SetSkipBackupAttribute Methode wie falsefolgt aufrufen:

NSFileManager.SetSkipBackupAttribute (filename, false); // file will be backed-up

Freigeben von Daten zwischen iOS-Apps und App-Erweiterungen

Da App-Erweiterungen als Teil einer Hostanwendung ausgeführt werden (im Gegensatz zu ihrer enthaltenden App), ist die Freigabe von Daten nicht automatisch enthalten, sodass zusätzliche Arbeit erforderlich ist. App-Gruppen sind der Mechanismus, den iOS verwendet, um verschiedenen Apps das Freigeben von Daten zu ermöglichen. Wenn die Anwendungen ordnungsgemäß mit den richtigen Berechtigungen und bereitstellungen konfiguriert wurden, können sie außerhalb ihrer normalen iOS-Sandbox auf ein freigegebenes Verzeichnis zugreifen.

Konfigurieren einer App-Gruppe

Der freigegebene Speicherort wird mithilfe einer App-Gruppe konfiguriert, die im Abschnitt "Zertifikate, Bezeichner und Profile" im iOS Dev Center konfiguriert ist. Auf diesen Wert muss auch in den Berechtigungen.plist jedes Projekts verwiesen werden.

Informationen zum Erstellen und Konfigurieren einer App-Gruppe finden Sie im Leitfaden zu App-Gruppenfunktionen.

Dateien

Die iOS-App und die Erweiterung können Dateien auch mithilfe eines gemeinsamen Dateipfads freigeben (sofern sie ordnungsgemäß mit den richtigen Berechtigungen und Bereitstellungen konfiguriert wurden):

var FileManager = new NSFileManager ();
var appGroupContainer =FileManager.GetContainerUrl ("group.com.xamarin.WatchSettings");
var appGroupContainerPath = appGroupContainer.Path

Console.WriteLine ("Group Path: " + appGroupContainerPath);

// use the path to create and update files
...

Wichtig

Wenn der zurückgegebene Gruppenpfad lautet null, überprüfen Sie die Konfiguration der Berechtigungen und des Bereitstellungsprofils, und stellen Sie sicher, dass sie korrekt sind.

Anwendungsversionsupdates

Wenn eine neue Version Ihrer Anwendung heruntergeladen wird, erstellt iOS ein neues Startverzeichnis und speichert das neue Anwendungsbundle darin. iOS verschiebt dann die folgenden Ordner aus der vorherigen Version Ihres Anwendungspakets in Ihr neues Startverzeichnis:

  • Dokumente
  • Bibliothek

Andere Verzeichnisse können auch quer kopiert und unter Ihr neues Startverzeichnis abgelegt werden, aber sie sind nicht garantiert kopiert, sodass Ihre Anwendung nicht auf dieses Systemverhalten angewiesen werden sollte.

Zusammenfassung

In diesem Artikel wurde gezeigt, dass Dateisystemvorgänge mit Xamarin.iOS mit jeder anderen .NET-Anwendung vergleichbar sind. Außerdem wurde die Anwendungs-Sandbox eingeführt und die Sicherheitsauswirkungen untersucht, die sie verursacht. Als Nächstes wurde das Konzept eines Anwendungspakets untersucht. Schließlich werden die speziellen Verzeichnisse aufgelistet, die für Ihre Anwendung verfügbar sind, und ihre Rollen während Anwendungsupgrades und Sicherungen erläutert.