Menu Górne

Kilka dni temu zmierzyłem się z tematem przechowywania plików aplikacji w systemie iOs. Teoretycznie temat jest błachy bo co może być skomplikowanego w zapisaniu pliku? Niestety nie dla wszystkich jest to oczywiste, postanowiłem więc zebrać informacje i podzielić się nimi w tym wpisie.

Pliki aplikacji iOs

Źródło: Apple documentation

System plików w systemie iOs różni się znacznie od tego znanego ze środowisk .Net. I nie pisze tutaj o tak oczywistych sprawach jak slash („/”) zamiast backslasha („\”) podczas dzielenia ścieżki, bo tutaj akurat windows wydaje się być egzotyczny. Nie mam na myśli również tego że system plików w iOs jest „case sensitive” czyli „abc.txt” to nie to samo co „ABC.txt”. Pisząc o różnicach mam na myśli dostęp do plików i zasobów systemu. W systemie iOs ze względów bezpieczeństwa mamy ograniczenia w dostępie do plików. Tak naprawdę aplikacja może tworzyć oraz usuwać pliki tylko w swojej przestrzeni „domowej”. Przestrzeń ta jest unikalną lokalizacją w systemie gdzie trzymane są wszystkie dane aplikacji. Rozwiązanie to nazywa się „Application Sandbox”.

Ważne: system plików na symulatorze iOs nie jest „case-sensitive”.

Paczka aplikacji

Czyli „Application Bundle” to nic innego jak folder zawierający aplikację z dodatkowym sufiksem „.app”. Najczęściej jego nazwa będzie następująca:”[NazwaAplikacji].app/”. Znajdują się w nim pliki wykonywalne aplikacji. Pliki są podpisane certyfikatem, więc jak nie trudno się domyślić nie możemy ich edytować. Mamy natomiast dostęp tylko do odczytu do plikó∑ z tego katalogu przez NSBundle.MainBundle.BundlePath. Zawartość tego katalogu nie jest backup’owana przez iTunes i iCloud.

Folder Documents

To jest właściwy folder dla dokumentów i plików użytkownika. Można udzielić dostępu do tego folderu przez iTunes oraz Files App (opis jak to zrobić znajdziesz poniżej). Jest to najbardziej dostępny folder z wszystkich, więc należy unikać używania do przechowywania plików krytycznych dla działania aplikacji np. baz danych. Chcąc uzyskać dostęp do tego folderu z kodu wystarczy użyć metody Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments). Folder documents jest backup’owany przez iTunes oraz iCloud. Dodatkowo podczas aktualizacji aplikacji jego zawartość jest kopiowana do nowej wersji.

Folder Library

To folder dla plików przed którymi przestrzegałem w poprzednim akapicie. To tutaj możemy zapisywać pliki których użytkownik nie powinien w ogóle widzieć, które są krytyczne dla działania aplikacji jak np. baza danych. Tego folderu nie możemy udostępnić przez iTunes. Można w nim oczywiście tworzyć podfoldery jednak trzeba uważać żeby ich nazwy nie kolidowały z folderami stworzonymi przez system. Zawartość tego katalogu wraz z jego podkatalogami poza małym wyjątkiem opisanym niżej są dodawane do kopii zapasowej iTunes oraz iCloud.

Podfolder Library/Preferences

Zawiera ustawienia specyficzne dla aplikacji. Pliki zawarte w tym katalogu powinniśmy tworzyc bezpośrednio w kodzie tylko przy użyciu klasy NSUserDefaults. Pliki będą dodane do kopii iCloud i iTunes.

Podfolder Library/Cache

Jest to bardzo specyficzny podfolder folderu library. Jego zawartość jako jedynego katalogu w Library nie jest backup’owana do iTunes oraz iCloud. Oznacza to że pliki aplikacji iOs przechowywane w tym folderze nie będą dostępne po przywróceniu urządzenia oraz aktualizacji aplikacji. Katalog ten jest przeznaczony do przechowywania plików które są przydatne w aplikacji ale mogą być bezproblemowo odtworzone. Są to najczęściej pliki pobierane z internetu, które przechowujemy po to aby aplikacja była dostępna bez połączenia do internetu, których nie potrzebujemy backup’ować bo w razie potrzeby możemy je pobrać ponownie (np. po aktualizacji aplikacji). W określonych sytuacjach np. w przypadku brakującej pamięci na urządzeniu dopuszcza się usunięcie plików przez system.

Folder tmp

Folder plików tymczasowych przeznaczony do plików potrzebnych przez krótki okres czasu, a nie ma potrzeby przechowywania ich pomiędzy uruchomieniami aplikacji. Dla oszczędności miejsca pliki powinniśmy usunąć niezwłocznie po tym jak przestaną być potrzebne. System operacyjny może usuwać pliki z tego folderu w dowolnym momencie gdy aplikacja nie jest włączona. Oczywiście zawartość tego folderu nie jest kopiowana do plików kopii zapasowych iTunes i iCloud.

Udostępnianie plików

iTunes

Jak już wcześniej pisałem folder Documents możemy udostępnić z poziomu programu iTunes. Mamy dwa sposoby aby to zrobić. Pierwszy sposób to edycja pliku Info.plist w Visual Studio, dodając nowy klucz wybrać z listy rozwijanej Application supports iTunes sharing.

Źródło: Microsoft docs

Drugi sposób to dodanie ręcznie do pliku np. w Atomie wiersza:
<key>UIFileSharingEnabled</key>
<true/>

Files App

Udostępnianie plików dla Files App jest w zasadzie analogiczne jak w iTunes. Tym razem wybieramy po prostu poniższą opcję:

Źródło: Microsoft docs

Można to oczywiście dodać bezpośrednio przez edytor tekstowy, w tym przypadku będzie to:

<key>LSSupportsOpeningDocumentsInPlace</key>    
<true/>

Od tej pory pliki aplikacji iOs powinny być dostępne dla użytkowników.

Podsumowanie

Obsługa plików aplikacji w systemie iOs jest na pierwszy rzut oka bardziej skomplikowana niż nam się wydaje jednak po dłuższym przeanalizowaniu zależności pomiędzy folderami, są one całkowicie logiczne. Opis ten pokazuje rózwnież że pozornie proste zapisywanie plików na urządzeniu musimy dobrze zaplanować. Wrzucając pliki przypadkowo możemy się pewnego dnia zdziwić gdy użytkownik usunie nam bazę danych z iTunes lub system usunie nam niezbędne do działania aplikacji pliki. Pamiętajmy również że np. podczas aktualizacji aplikacji kopiowane są tylko foldery Documents oraz Library. Z drugiej strony zdziwić może się użytkownik gdy przez naszą nieuwagę zapchamy mu iCloud naszymi plikami tymczasowymi pobranymi z internetu.

Linki:
Apple Developer Docs
Apple Documentation Archive
Microsoft Docs

O autorze

Niepoprawny optymista. 100 pomysłów na sekundę, wielbiciel nowych technologii, nie tylko z rodziny .Net. Często nosi przy sobie jabłko, takie nadgryzione... ;)

1 Comment

  1. Gdzie przechowywać pliki aplikacji w iOs – developer.net.pl

    Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz używać znaczników języka HTML i ich atrybutów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Zamknij