Přístup k systému souborů v Xamarin.iOS

Pro přístup k systému souborů iOS můžete použít Xamarin.iOS a System.IO třídy v knihovně základních tříd .NET (BCL ). Třída File umožňuje vytvářet, odstraňovat a číst soubory a Directory třída umožňuje vytvářet, odstraňovat nebo vyčíslovat obsah adresářů. Můžete také použít Stream podtřídy, které můžou poskytovat větší kontrolu nad operacemi se soubory (například kompresi nebo hledání pozice v souboru).

iOS omezuje, co může aplikace dělat se systémem souborů, aby zachovala zabezpečení dat aplikace a chránila uživatele před zhoubnými aplikacemi. Tato omezení jsou součástí sandboxu aplikace – sada pravidel, která omezují přístup aplikace k souborům, předvolbám, síťovým prostředkům, hardwaru atd. Aplikace je omezena na čtení a zápis souborů v jeho domovském adresáři (nainstalované umístění); nemá přístup k souborům jiné aplikace.

IOS má také některé funkce specifické pro systém souborů: některé adresáře vyžadují zvláštní zacházení s ohledem na zálohování a upgrady a aplikace mohou také sdílet soubory s ostatními a aplikace Files (od iOS 11) a prostřednictvím iTunes.

Tento článek popisuje funkce a omezení systému souborů iOS a obsahuje ukázkovou aplikaci, která demonstruje použití Xamarin.iOS ke spuštění některých jednoduchých operací se systémem souborů:

Ukázka provádění některých jednoduchých operací systému souborů s iOSem

Obecný přístup k souborům

Xamarin.iOS umožňuje používat třídy .NET System.IO pro operace se systémem souborů v iOSu.

Následující fragmenty kódu ilustrují některé běžné operace se soubory. Všechny najdete níže v souboru SampleCode.cs v ukázkové aplikaci pro tento článek.

Práce s adresáři

Tento kód vyčísluje podadresáře v aktuálním adresáři (určený parametrem ./), což je umístění spustitelného souboru aplikace. Vaším výstupem bude seznam všech souborů a složek nasazených ve vaší aplikaci (zobrazí se v okně konzoly při ladění).

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

Čtení souborů

Ke čtení textového souboru potřebujete jenom jeden řádek kódu. Tento příklad zobrazí obsah textového souboru v okně Výstup aplikace.

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

serializace XML

I když práce s úplným System.Xml oborem názvů přesahuje rozsah tohoto článku, můžete snadno deserializovat dokument XML ze systému souborů pomocí StreamReader, jako je tento fragment kódu:

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

Další informace naleznete v dokumentaci pro System.Xml a serializace. Viz dokumentace K Xamarin.iOS linker – často budete muset přidat [Preserve] atribut do tříd, které chcete serializovat.

Vytváření souborů a adresářů

Tato ukázka ukazuje, jak pomocí Environment třídy získat přístup ke složce Dokumenty, kde můžeme vytvářet soubory a adresáře.

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

Vytvoření adresáře je podobný proces:

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

Další informace najdete v referenčních informacích k System.IO rozhraní API.

Serializace JSON

Json.NET je vysoce výkonná architektura JSON, která funguje s Xamarin.iOS a je k dispozici na NuGetu. Přidejte balíček NuGet do projektu aplikace pomocí funkce Přidat NuGet v Visual Studio pro Mac:

Přidání balíčku NuGet do projektu aplikací

Dále přidejte třídu, která bude fungovat jako datový model pro serializaci/deserializaci (v tomto případě 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() {
        }
    }
}

Nakonec vytvořte instanci Account třídy, serializujte ji na data JSON a zapište ji do souboru:

// 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);

Další informace o práci s daty JSON v aplikaci .NET najdete v dokumentaci json.NET.

Speciální předpoklady

Navzdory podobnostem mezi operacemi souborů Xamarin.iOS a .NET se iOS a Xamarin.iOS liší od .NET několika důležitými způsoby.

Zpřístupnění souborů projektu za běhu

Pokud do projektu přidáte soubor, nebude ve výchozím nastavení zahrnut do konečného sestavení, a proto nebude k dispozici pro vaši aplikaci. Pokud chcete do sestavení zahrnout soubor, musíte ho označit speciální akcí sestavení s názvem Obsah.

Pokud chcete soubor označit jako vložený, klikněte pravým tlačítkem myši na soubory a v Visual Studio pro Mac zvolte Vytvořit obsah akce>. Akci sestavení můžete také změnit v listu Vlastnosti souboru.

Rozlišování malých a velkých písmen

Je důležité pochopit, že v systému souborů iOS se rozlišují malá a velká písmena. Citlivost na velká a malá písmena znamená, že názvy souborů a adresářů se musí přesně shodovat – README.txt a readme.txt by se považovaly za různé názvy souborů.

To může být matoucí pro vývojáře .NET, kteří jsou obeznámeni se systémem souborů Windows, což je případ nerozlišujícíSoubory, SOUBORY a soubory by všechny odkazovaly na stejný adresář.

Upozorňující

Simulátor iOS nerozlišuje malá a velká písmena. Pokud se velikost názvu souboru liší mezi samotným souborem a odkazy na něj v kódu, může váš kód stále fungovat v simulátoru, ale na skutečném zařízení selže. Je to jeden z důvodů, proč je důležité nasazovat a testovat na skutečném zařízení včas a často během vývoje pro iOS.

Oddělovač cest

iOS používá lomítko /jako oddělovač cesty (který se liší od Windows, který používá zpětné lomítko \).

Vzhledem k tomuto matoucímu rozdílu je vhodné použít metodu System.IO.Path.Combine , která se upravuje pro aktuální platformu, a nikoli pevně zakódovat konkrétní oddělovač cest. Jedná se o jednoduchý krok, díky kterému je váš kód přenosnější na jiné platformy.

Sandbox aplikace

Přístup aplikace k systému souborů (a dalším prostředkům, jako jsou síťové a hardwarové funkce), je omezený z bezpečnostních důvodů. Toto omezení se označuje jako Sandbox aplikace. Z hlediska systému souborů je vaše aplikace omezena na vytváření a odstraňování souborů a adresářů v jeho domovském adresáři.

Domovský adresář je jedinečné umístění v systému souborů, kde jsou uložena vaše aplikace a všechna její data. Nemůžete zvolit (ani změnit) umístění domovského adresáře pro vaši aplikaci; ale iOS a Xamarin.iOS poskytují vlastnosti a metody pro správu souborů a adresářů uvnitř.

Sada aplikací

Sada aplikací je složka, která obsahuje vaši aplikaci. Rozlišují se od jiných složek tím, že mají příponu .app přidanou do názvu adresáře. Sada aplikací obsahuje váš spustitelný soubor a veškerý obsah (soubory, obrázky atd.) potřebný pro váš projekt.

Když v systému Mac OS přejdete do sady aplikací, zobrazí se s jinou ikonou, než vidíte v jiných adresářích (a přípona .app je skrytá). Jedná se ale jenom o běžný adresář, ve kterém se operační systém zobrazuje jinak.

Pokud chcete zobrazit sadu aplikací pro vzorový kód, klikněte pravým tlačítkem myši na projekt v Visual Studio pro Mac a vyberte Zobrazit ve Finderu. Pak přejděte do koše nebo adresáře, kde byste měli najít ikonu aplikace (podobně jako na snímku obrazovky níže).

V adresáři bin vyhledejte ikonu aplikace podobnou tomuto snímku obrazovky.

Klikněte pravým tlačítkem myši na tuto ikonu a zvolte Zobrazit obsah balíčku a procházejte obsah adresáře sady aplikací. Obsah se zobrazuje stejně jako obsah běžného adresáře, jak je znázorněno tady:

Obsah sady aplikací

Sada aplikací je to, co je nainstalované v simulátoru nebo na vašem zařízení během testování, a nakonec se odešle společnosti Apple pro zahrnutí do App Storu.

Adresáře aplikací

Když je aplikace nainstalovaná na zařízení, operační systém vytvoří pro vaši aplikaci domovský adresář a v kořenovém adresáři aplikace vytvoří několik adresářů, které jsou k dispozici pro použití. Vzhledem k tomu, že adresáře přístupné uživatelům nejsou umístěny v kořenovém adresáři aplikace, takže nemůžete odvodit cesty pro sadu aplikací z adresářů uživatelů nebo naopak.

Tyto adresáře, jak určit jejich cestu a jejich účely, jsou uvedeny níže:

 

Adresář Popis
[ApplicationName].app/ V iOSu 7 a starších verzích je ApplicationBundle to adresář, ve kterém je uložený spustitelný soubor vaší aplikace. Adresářová struktura, kterou vytvoříte v aplikaci, existuje v tomto adresáři (například obrázky a další typy souborů, které jste v projektu Visual Studio pro Mac označili jako Prostředky).

Pokud potřebujete získat přístup k souborům obsahu ve vaší sadě aplikací, cesta k tomuto adresáři je k dispozici prostřednictvím NSBundle.MainBundle.BundlePath vlastnosti.
Dokumenty/ Tento adresář slouží k ukládání uživatelských dokumentů a datových souborů aplikací.

Obsah tohoto adresáře může být uživateli zpřístupněn prostřednictvím sdílení souborů iTunes (i když je ve výchozím nastavení zakázaný). UIFileSharingEnabled Přidejte do souboru Info.plist logický klíč, který uživatelům umožní přístup k těmto souborům.

I když aplikace okamžitě nepovolí sdílení souborů, měli byste se vyhnout umístění souborů, které by měly být uživatelům v tomto adresáři skryté (například databázové soubory, pokud je nechcete sdílet). Pokud citlivé soubory zůstanou skryté, nebudou tyto soubory zpřístupněny (a potenciálně přesunuté, změněné nebo odstraněné službou iTunes), pokud je sdílení souborů v budoucí verzi povolené.

Pomocí této metody můžete Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) získat cestu k adresáři Documents pro vaši aplikaci.

Obsah tohoto adresáře zálohuje iTunes.
Knihovny/ Adresář knihovny je vhodným místem pro ukládání souborů, které nejsou vytvořené přímo uživatelem, jako jsou databáze nebo jiné soubory generované aplikací. Obsah tohoto adresáře se nikdy nezostavuje uživateli prostřednictvím iTunes.

V knihovně můžete vytvořit vlastní podadresáře; Existuje však již několik adresářů vytvořených systémem, o nichž byste měli vědět, včetně předvoleb a mezipamětí.

Obsah tohoto adresáře (s výjimkou podadresáře Caches) zálohuje iTunes. Vlastní adresáře, které vytvoříte v knihovně, se zálohuje.
Knihovna/Předvolby/ Soubory předvoleb specifické pro aplikaci jsou uloženy v tomto adresáři. Tyto soubory nevytvořujte přímo. Místo toho použijte NSUserDefaults třídu.

Obsah tohoto adresáře zálohuje iTunes.
Knihovna/ Mezipaměti/ Adresář Caches je vhodným místem pro ukládání datových souborů, které můžou vaší aplikaci pomoct spustit, ale dá se snadno znovu vytvořit. Aplikace by měla tyto soubory podle potřeby vytvořit a odstranit a v případě potřeby je znovu vytvořit. iOS 5 může také odstranit tyto soubory (v situacích s nízkým úložištěm), ale nebude to dělat, když je aplikace spuštěná.

Obsah tohoto adresáře není zálohován službou iTunes, což znamená, že nebudou k dispozici, pokud uživatel obnoví zařízení a nemusí být k dispozici po instalaci aktualizované verze vaší aplikace.

Například v případě, že se vaše aplikace nemůže připojit k síti, můžete použít adresář Caches k ukládání dat nebo souborů k zajištění dobrého offline prostředí. Aplikace může tato data rychle ukládat a načítat při čekání na odezvy v síti, ale nemusí se zálohovat a po obnovení nebo aktualizaci verze je možné je snadno obnovit nebo znovu vytvořit.
Tmp/ Aplikace můžou v tomto adresáři ukládat dočasné soubory, které jsou potřeba jen na krátkou dobu. Aby se ušetřilo místo, měly by se soubory odstranit, pokud už nejsou potřeba. Operační systém může také odstranit soubory z tohoto adresáře, pokud aplikace není spuštěná.

Obsah tohoto adresáře nezálohuje iTunes.

Například adresář tmp se může použít k ukládání dočasných souborů stažených pro zobrazení uživateli (například avatarů Twitteru nebo příloh e-mailů), ale můžou být odstraněny, jakmile budou zobrazeny (a znovu staženy, pokud jsou vyžadovány v budoucnu).

Tento snímek obrazovky ukazuje adresářovou strukturu v okně Finderu:

Tento snímek obrazovky ukazuje strukturu adresářů v okně Finderu.

Přístup k jiným adresářům prostřednictvím kódu programu

Předchozí adresář a příklady souborů přistupovaly k adresáři Documents . Pokud chcete zapisovat do jiného adresáře, musíte vytvořit cestu pomocí syntaxe ".", jak je znázorněno zde:

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");

Vytvoření adresáře je podobné:

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

Cesty k Caches adresářům a tmp adresářům je možné vytvořit takto:

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

Sdílení s aplikací Soubory

iOS 11 zavedl aplikaci Files – prohlížeč souborů pro iOS, který umožňuje uživateli zobrazit a pracovat se svými soubory v iCloudu a také uloženou libovolnou aplikací, která ji podporuje. Pokud chcete uživateli povolit přímý přístup k souborům v aplikaci, vytvořte v souboru LSSupportsOpeningDocumentsInPlace Info.plist nový logický klíč a nastavte ho na true, jak je znázorněno tady:

Nastavení LSSupportsOpeningDocumentsInPlace v Info.plist

Adresář Dokumenty aplikace bude nyní k dispozici pro procházení v aplikaci Soubory. V aplikaci Soubory přejděte na Můj i Telefon a každá aplikace se sdílenými soubory bude viditelná. Následující snímky obrazovky ukazují, jak vypadá ukázková aplikace:

Aplikace Soubory pro iOS 11Procházet soubory i TelefonUkázkové soubory aplikací

Sdílení souborů s uživatelem prostřednictvím iTunes

Uživatelé mají přístup k souborům v adresáři Dokumenty aplikace úpravou Info.plist a vytvořením aplikace, která podporuje položku sdíleníUIFileSharingEnabled () iTunes v zobrazení Zdroj, jak je znázorněno tady:

Přidání aplikace podporuje vlastnost sdílení iTunes

K těmto souborům se dostanete v iTunes, když je zařízení připojené a uživatel zvolí Apps kartu. Například následující snímek obrazovky ukazuje soubory ve vybrané aplikaci sdílené přes iTunes:

Tento snímek obrazovky ukazuje soubory ve vybrané aplikaci sdílené přes iTunes.

Uživatelé mají přístup pouze k položkám nejvyšší úrovně v tomto adresáři prostřednictvím iTunes. Obsah žádných podadresářů nevidí (i když je můžou zkopírovat do počítače nebo je odstranit). Například s GoodReader, PDF a EPUB soubory lze sdílet s aplikací, aby je uživatelé mohli číst na svých zařízeních s iOSem.

Uživatelé, kteří upravují obsah složky Dokumenty, můžou způsobit problémy, pokud nejsou opatrní. Vaše aplikace by měla vzít v úvahu tuto skutečnost a být odolná vůči destruktivním aktualizacím složky Dokumenty.

Vzorový kód pro tento článek vytvoří soubor i složku ve složce Dokumenty (v SampleCode.cs) a povolí sdílení souborů v souboru Info.plist . Tento snímek obrazovky ukazuje, jak se zobrazují v iTunes:

Tento snímek obrazovky ukazuje, jak se soubory zobrazují v iTunes.

Informace o tom, jak nastavit ikony pro aplikaci a pro všechny vlastní typy dokumentů, které vytvoříte, najdete v článku Práce s obrázky.

UIFileSharingEnabled Pokud je klíč false nebo není k dispozici, sdílení souborů je ve výchozím nastavení zakázané a uživatelé nebudou moct pracovat s adresářem Dokumenty.

Zálohování a obnovení

Když zařízení zálohuje iTunes, uloží se všechny adresáře vytvořené v domovském adresáři vaší aplikace s výjimkou následujících adresářů:

  • [ApplicationName].app – Nezapisujte do tohoto adresáře, protože je podepsaný a proto po instalaci musí zůstat beze změny. Může obsahovat prostředky, ke kterým přistupujete z kódu, ale nevyžadují zálohování, protože by se obnovily opětovným stažením aplikace.
  • Knihovna/mezipaměti – Adresář mezipaměti je určený pro pracovní soubory, které není potřeba zálohovat.
  • tmp – Tento adresář se používá pro dočasné soubory, které jsou vytvořeny a odstraněny, pokud už nepotřebujete, nebo pro soubory, které iOS odstraní, když potřebuje místo.

Zálohování velkého množství dat může trvat dlouhou dobu. Pokud se rozhodnete, že potřebujete zálohovat libovolný konkrétní dokument nebo data, měla by vaše aplikace používat složky Dokumenty a knihovny. V případě přechodných dat nebo souborů, které lze snadno načíst ze sítě, použijte buď mezipaměť, nebo adresář tmp.

Poznámka:

IOS systém souborů "vyčistí", když zařízení bude mít kriticky málo místa na disku. Tento proces odebere všechny soubory ze složky Library/Caches a tmp aplikací, které nejsou aktuálně spuštěné.

Dodržování omezení zálohování pro iOS 5 iCloud

Poznámka:

I když se tato zásada poprvé představila v iOSu 5 (což se zdá jako dávno) jsou pokyny pro dnešní aplikace stále relevantní.

Apple představil funkce zálohování iCloudu s iOSem 5. Pokud je povolené zálohování iCloudu, zálohují se všechny soubory v domovském adresáři vaší aplikace (s výjimkou adresářů, které nejsou normálně zálohované, například sada Cachesaplikací a tmp) na servery iCloud. Tato funkce poskytuje uživateli úplnou zálohu v případě ztráty, odcizení nebo poškození zařízení.

Vzhledem k tomu, že iCloud poskytuje každému uživateli pouze 5 GB volného místa a aby se zbytečně nevyužívat šířku pásma, Apple očekává, že aplikace budou zálohovat jenom důležitá uživatelsky generovaná data. Pokud chcete dodržovat pokyny pro ukládání dat pro iOS, měli byste omezit množství dat, která se zálohují, a to dodržováním následujících položek:

  • Ukládat pouze uživatelem generovaná data nebo data, která se jinak nedají znovu vytvořit, v adresáři Dokumenty (který je zálohovaný).
  • Uložte všechna další data, která je možné snadno znovu vytvořit nebo znovu stáhnout Library/Caches nebo tmp (která se nezálohuje a je možné je vyčistit).
  • Pokud máte soubory, které můžou být vhodné pro danou Library/Caches složku nebo tmp složku, ale nechcete je vyčistit, uložte je jinam (například Library/YourData) a použijte atribut Nezálohovat, abyste zabránili souborům v používání šířky pásma zálohování iCloudu a prostoru úložiště. Tato data stále využívají místo na zařízení, takže byste je měli spravovat pečlivě a odstranit, pokud je to možné.

Atribut do not back up je nastaven pomocí NSFileManager třídy. Ujistěte se, že vaše třída je using Foundation a volá SetSkipBackupAttribute se takto:

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

Pokud SetSkipBackupAttribute se true soubor nezazálohuje, bez ohledu na adresář, ve který je uložený (i v adresáři Documents ). Atribut můžete dotazovat pomocí GetSkipBackupAttribute metody a můžete ho SetSkipBackupAttribute resetovat voláním metody falsetakto:

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

Sdílení dat mezi aplikacemi pro iOS a rozšířeními aplikací

Vzhledem k tomu, že rozšíření aplikací běží jako součást hostitelské aplikace (na rozdíl od aplikace obsahující), sdílení dat není automaticky zahrnuté, takže je potřeba provést další práci. Skupiny aplikací jsou mechanismus, který iOS používá k tomu, aby různé aplikace mohly sdílet data. Pokud jsou aplikace správně nakonfigurované se správnými nároky a zřizováním, můžou přistupovat ke sdílenému adresáři mimo normální sandbox iOS.

Konfigurace skupiny aplikací

Sdílené umístění se konfiguruje pomocí skupiny aplikací, která je nakonfigurovaná v části Certifikáty, identifikátory a profily v iOS Dev Center. Na tuto hodnotu se také musí odkazovat v souboru Entitlements.plist každého projektu.

Informace o vytváření a konfiguraci skupiny aplikací najdete v průvodci možnostmi skupiny aplikací.

Soubory

Aplikace pro iOS a rozšíření můžou také sdílet soubory pomocí společné cesty k souboru (vzhledem k tomu, že jsou správně nakonfigurované se správnými nároky a zřizováním):

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
...

Důležité

Pokud je nullvrácená cesta skupiny, zkontrolujte konfiguraci nároků a zřizovacího profilu a ujistěte se, že jsou správné.

Aktualizace verzí aplikací

Když se stáhne nová verze aplikace, iOS vytvoří nový domovský adresář a uloží do ní novou sadu aplikací. IOS pak přesune následující složky z předchozí verze sady aplikací do nového domovského adresáře:

  • Dokumenty
  • Knihovny

Ostatní adresáře se také můžou zkopírovat do nového domovského adresáře a vložit je do nového domovského adresáře, ale není zaručeno, že se zkopírují, takže by se vaše aplikace neměla spoléhat na toto systémové chování.

Shrnutí

Tento článek ukázal, že operace systému souborů s Xamarin.iOS jsou podobné jakékoli jiné aplikaci .NET. Zavedla také sandbox aplikace a prozkoumala důsledky zabezpečení, které způsobuje. Dále prozkoumal koncept sady aplikací. Nakonec vyčíslil specializované adresáře, které jsou k dispozici pro vaši aplikaci, a vysvětlil jejich role během upgradů a záloh aplikací.