Xamarin. iOS でのファイルシステムアクセスFile system access in Xamarin.iOS

サンプルのダウンロードサンプルのダウンロードDownload Sample Download the sample

IOS ファイルシステムにアクセスするには、 .Net 基本クラスライブラリ (BCL) の Xamarin. iOS と System.IO クラスを使用します。You can use Xamarin.iOS and the System.IO classes in the .NET Base Class Library (BCL) to access the iOS file system. File クラスでは、ファイルを作成し、削除し、読み込むことができます。Directory クラスでは、ディレクトリの内容を作成し、削除し、列挙できます。The File class lets you create, delete, and read files, and the Directory class allows you to create, delete, or enumerate the contents of directories. また、Stream サブクラスを使用することもできます。これにより、ファイルの操作 (圧縮やファイル内の位置検索など) をより細かく制御できます。You can also use Stream subclasses, which can provide a greater degree of control over file operations (such as compression or position search within a file).

iOS では、アプリケーションのデータのセキュリティを維持し、malignant アプリからユーザーを保護するために、ファイルシステムで実行できる処理についていくつかの制限が課されています。iOS imposes some restrictions on what an application can do with the file system to preserve the security of an application’s data, and to protect users from malignant apps. これらの制限は、アプリケーションサンドボックスに含まれています。アプリケーションのファイル、基本設定、ネットワークリソース、ハードウェアなどへのアクセスを制限する一連の規則です。アプリケーションでは、ホームディレクトリ (インストール場所) 内のファイルの読み取りと書き込みが制限されています。別のアプリケーションのファイルにアクセスすることはできません。These restrictions are part of the Application Sandbox – a set of rules that limits an application’s access to files, preferences, network resources, hardware, etc. An application is limited to reading and writing files within its home directory (installed location); it cannot access another application’s files.

iOS には、ファイルシステム固有の機能がいくつかあります。一部のディレクトリでは、バックアップとアップグレードに関して特別な処理が必要であり、アプリケーションはファイル (iOS 11 以降) と iTunes を使用して、ファイルを相互に共有することもできます。iOS also has some file system-specific features: certain directories require special treatment with respect to backups and upgrades, and applications can also share files with each other and the Files app (since iOS 11), and via iTunes.

この記事では、iOS ファイルシステムの機能と制限について説明します。また、Xamarin を使用していくつかの単純なファイルシステム操作を実行する方法を示すサンプルアプリケーションを紹介します。This article discusses the features and restrictions of the iOS file system, and includes a sample application that demonstrates how to use Xamarin.iOS to execute some simple file system operations:

いくつかの単純なファイルシステム操作を実行する iOS のサンプルをするA sample of iOS executing some simple file system operations

一般的なファイルアクセスGeneral file access

Xamarin iOS では、iOS でファイルシステム操作に .NET System.IO クラスを使用できます。Xamarin.iOS allows you to use the .NET System.IO classes for file system operations on iOS.

次のコードスニペットは、一般的なファイル操作を示しています。The following code snippets illustrate some common file operations. これらはすべて、この記事のサンプルアプリケーションのSampleCode.csファイルに含まれています。You’ll find them all below in the SampleCode.cs file, in the sample application for this article.

ディレクトリの操作Working with directories

このコードは、現在のディレクトリ内のサブディレクトリ ("./" パラメーターで指定) を列挙します。これは、アプリケーションの実行可能ファイルの場所です。This code enumerates the subdirectories in the current directory (specified by the "./" parameter), which is the location of your application executable. 出力は、アプリケーションと共に配置されたすべてのファイルとフォルダーの一覧になります (デバッグ中にコンソールウィンドウに表示されます)。Your output will be a list of all the files and folders that are deployed with your application (displayed in the console window while you are debugging).

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

ファイルの読み取りReading files

テキストファイルを読み取るには、1行のコードだけが必要です。To read a text file, you only need a single line of code. この例では、[アプリケーション出力] ウィンドウにテキストファイルの内容を表示します。This example will display the contents of a text file in the Application Output window.

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

XML シリアル化XML serialization

この記事では、完全な System.Xml 名前空間の操作については説明しませんが、次のコードスニペットのような StreamReader を使用して、ファイルシステムから XML ドキュメントを簡単に逆シリアル化することができます。Although working with the complete System.Xml namespace is beyond the scope of this article, you can easily deserialize an XML document from the file system by using a StreamReader like this code snippet:

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

詳細については、 system.xmlシリアル化に関するドキュメントを参照してください。For more information, see the documentation for System.Xml and serialization. リンカーに関するXamarin. iOS のドキュメントを参照してください。多くの場合、シリアル化するクラスに [Preserve] 属性を追加する必要があります。See the Xamarin.iOS documentation on the linker – often you will need to add the [Preserve] attribute to classes you intend to serialize.

ファイルとディレクトリの作成Creating files and directories

このサンプルでは、Environment クラスを使用して、ファイルとディレクトリを作成できる Documents フォルダーにアクセスする方法を示します。This sample shows how to use the Environment class to access the Documents folder where we can create files and directories.

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

ディレクトリの作成は同様のプロセスです。Creating a directory is a similar process:

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

詳細については、 SYSTEM.IO API リファレンスを参照してください。For more information see the System.IO API reference.

JSON のシリアル化Serializing JSON

Json.NETは、Xamarin で動作する高パフォーマンスの Json フレームワークであり、NuGet で利用できます。Json.NET is a high-performance JSON framework that works with Xamarin.iOS and is available on NuGet. Visual Studio for Mac でnuget を追加して、nuget パッケージをアプリケーションプロジェクトに追加します。Add the NuGet package to your application project, using Add NuGet in Visual Studio for Mac:

次に、シリアル化/逆シリアル化のデータモデルとして機能するクラスを追加します (この場合 Account.cs)。Next, add a class to act as the data model for serialization/deserialization (in this case 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() {
        }
    }
}

最後に、Account クラスのインスタンスを作成し、それを json データにシリアル化してファイルに書き込みます。Finally, create an instance of the Account class, serialize it to json data and write it to a file:

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

.NET アプリケーションで json データを操作する方法の詳細については、「Json. NET のドキュメント」を参照してください。For more information about working with json data in a .NET application, see Json.NET's documentation.

特別な考慮事項Special considerations

Xamarin の iOS と .NET のファイル操作 (iOS と Xamarin) の類似性は似ていますが、いくつかの重要な点で .NET とは異なります。Despite the similarities between Xamarin.iOS and .NET file operations, iOS and Xamarin.iOS differ from .NET in some important ways.

実行時にプロジェクトファイルにアクセスできるようにするMaking project files accessible at runtime

既定では、プロジェクトにファイルを追加しても、最終的なアセンブリには含まれないため、アプリケーションでは使用できません。By default, if you add a file to your project, it won’t be included in the final assembly, and therefore won’t be available to your application. アセンブリにファイルを含めるには、コンテンツと呼ばれる特別なビルドアクションを使用してファイルをマークする必要があります。In order to include a file in the assembly, you must mark it with a special build action, called Content.

ファイルを含めるようにマークするには、ファイルを右クリックし、Visual Studio for Mac で [ビルドアクション > コンテンツ] を選択します。To mark a file for inclusion, right-click on the file(s) and choose Build Action > Content in Visual Studio for Mac. また、ファイルのプロパティシートでビルドアクションを変更することもできます。You can also change the Build Action in the file’s Properties sheet.

大文字と小文字の区別Case sensitivity

IOS ファイルシステムでは大文字と小文字が区別されることを理解しておくことが重要です。It’s important to understand that the iOS file system is case-sensitive. 大文字と小文字の区別は、ファイル名とディレクトリ名が完全に一致する必要があることを意味します。 readme.txt と readme.txtは、異なるファイル名と見なされます。Case-sensitivity means that your file and directory names must match exactly – README.txt and readme.txt would be considered different filenames.

これは、Windows ファイルシステムに慣れている .NET 開発者が、ファイルファイルファイルがすべて同じディレクトリを参照している場合に、混乱を招く可能性があります。This could be confusing for .NET developers who are more familiar with the Windows file system, which is case insensitiveFiles, FILES, and files would all refer to the same directory.

警告

IOS シミュレーターでは、大文字と小文字は区別されません。The iOS Simulator is NOT case-sensitive. ファイル名の大文字と小文字の区別がファイル自体とコード内での参照の間で異なる場合は、コードがシミュレーターで動作しても、実際のデバイスでは失敗します。If your filename casing differs between the file itself and the references to it in code, your code might still work in the simulator but it will fail on a real device. これは、iOS の開発中に、通常のデバイスでのデプロイとテストが重要な理由の1つです。This is one of the reasons why it’s important to deploy and test on an actual device early and often during iOS development.

パスの区切りPath separator

iOS では、パスの区切り記号としてスラッシュ '/' が使用されます (これは、円記号 ' \ ' を使用する Windows とは異なります)。iOS uses the forward slash ‘/’as the path separator (which is different from Windows, which uses the backslash ‘\’).

この違いにより、特定のパス区切り記号をハードコーディングするのではなく、現在のプラットフォームに合わせて調整する System.IO.Path.Combine メソッドを使用することをお勧めします。Because of this confusing difference, it’s good practice to use the System.IO.Path.Combine method, which adjusts for the current platform, rather than hardcode a particular path separator. これは、コードを他のプラットフォームに移植できるようにするための簡単な手順です。This is a simple step that makes your code more portable to other platforms.

アプリケーションサンドボックスApplication sandbox

ファイルシステムへのアプリケーションのアクセス (およびネットワークやハードウェアの機能などの他のリソース) は、セキュリティ上の理由で制限されています。Your application’s access to the file system (and other resources such as the network and hardware features) is limited for security reasons. この制限は、アプリケーションサンドボックスと呼ばれます。This restriction is known as the Application Sandbox. ファイルシステムに関しては、アプリケーションはホームディレクトリ内のファイルとディレクトリの作成と削除に限定されます。In terms of the file system, your application is limited to creating and deleting files and directories in its home directory.

ホームディレクトリは、アプリケーションとそのすべてのデータが格納されるファイルシステム内の一意の場所です。The home directory is a unique location in the file system where your application and all its data are stored. アプリケーションのホームディレクトリの場所を選択 (または変更) することはできません。ただし、iOS と Xamarin には、内のファイルとディレクトリを管理するためのプロパティとメソッドが用意されています。You cannot choose (or change) the location of the home directory for your application; however iOS and Xamarin.iOS provide properties and methods to manage the files and directories inside.

アプリケーションバンドルThe application bundle

アプリケーションバンドルは、アプリケーションが含まれているフォルダーです。The Application Bundle is the folder that contains your application. 他のフォルダーと区別するには、ディレクトリ名に. app サフィックスを追加します。It is distinguished from other folders by having the .app suffix added to the directory name. アプリケーションバンドルには、実行可能ファイルと、プロジェクトに必要なすべてのコンテンツ (ファイルやイメージなど) が含まれています。Your application bundle contains your executable file and all the content (files, images, etc.) necessary for your project.

Mac OS でアプリケーションバンドルを参照すると、他のディレクトリに表示されるものとは異なるアイコンが表示されます(と、アプリのサフィックスは非表示になります)。ただし、これはオペレーティングシステムの表示が異なる通常のディレクトリにすぎません。When you browse to your application bundle in Mac OS, it appears with a different icon than you see in other directories (and the .app suffix is hidden); however, it’s just a regular directory that the operating system is displaying differently.

サンプルコードのアプリケーションバンドルを表示するには、 Visual Studio for Macでプロジェクトを右クリックし、[ Finder で表示] を選択します。To view the application bundle for the sample code, right-click on the project in Visual Studio for Mac and select Reveal in Finder. 次に、アプリケーションアイコンがあるbin/ ディレクトリ (次のスクリーンショットのように) に移動します。Then navigate to the bin/ directory where you should find an application icon (similar to the screenshot below).

Bin ディレクトリ内を移動して、次のスクリーンショットのようなアプリケーションアイコンを見つけます。

このアイコンを右クリックし、 [パッケージの内容の表示] を選択して、アプリケーションバンドルディレクトリの内容を参照します。Right-click on this icon and choose Show Package Contents to browse the contents of the Application Bundle directory. 次に示すように、コンテンツは通常のディレクトリの内容と同様に表示されます。The contents appear just like the contents of a regular directory, as shown here:

アプリバンドルの内容をするThe contents of the app bundle

アプリケーションバンドルは、テスト中にシミュレーターまたはデバイスにインストールされるものです。最終的に、アプリストアに含まれるように Apple に送信されます。The application bundle is what’s installed on the simulator or on your device during testing, and ultimately it is what’s submitted to Apple for inclusion in the App Store.

アプリケーションディレクトリApplication directories

アプリケーションがデバイスにインストールされると、オペレーティングシステムによってアプリケーションのホームディレクトリが作成され、アプリケーションのルートディレクトリ内に、使用可能な多数のディレクトリが作成されます。When your application is installed on a device, the operating system creates a home directory for your application, and creates a number of directories within the application root directory that are available for use. IOS 8 以降では、ユーザーがアクセスできるディレクトリはアプリケーションルート内に配置されていないため、ユーザーディレクトリからアプリケーションバンドルのパスを派生させることはできません。また、その逆も可能です。Since iOS 8, the user-accessible directories are NOT located within the application root, so you can't derive the paths for the application bundle from the user directories, or vice versa.

これらのディレクトリ、パスを決定する方法、およびその目的を次に示します。These directories, how to determine their path, and their purposes are listed below:

 

ディレクトリDirectory 説明Description
[ApplicationName]。アプリ/[ApplicationName].app/ IOS 7 以前では、これはアプリケーションの実行可能ファイルが格納されている ApplicationBundle ディレクトリです。In iOS 7 and earlier, this is the ApplicationBundle directory where your application executable is stored. アプリで作成したディレクトリ構造は、このディレクトリに存在します (たとえば、Visual Studio for Mac プロジェクトでリソースとしてマークしたイメージやその他のファイルの種類など)。The directory structure that you create in your app exists in this directory (for example, images and other file types that you’ve marked as Resources in your Visual Studio for Mac project).

アプリケーションバンドル内のコンテンツファイルにアクセスする必要がある場合は、NSBundle.MainBundle.BundlePath プロパティを使用してこのディレクトリへのパスを取得できます。If you need to access the content files inside your Application Bundle, the path to this directory is available via the NSBundle.MainBundle.BundlePath property.
ドキュメントDocuments/ ユーザードキュメントとアプリケーションデータファイルを格納するには、このディレクトリを使用します。Use this directory to store user documents and application data files.

このディレクトリの内容は、iTunes ファイル共有を通じてユーザーが使用できるようにすることができます (ただし、既定では無効になっています)。The contents of this directory can be made available to the user through iTunes file sharing (although this is disabled by default). ユーザーがこれらのファイルにアクセスできるようにするには、UIFileSharingEnabled ブール型キーを情報 plist ファイルに追加します。Add a UIFileSharingEnabled Boolean key to the Info.plist file to allow users to access these files.

アプリケーションでファイル共有をすぐに有効にしない場合でも、このディレクトリ (共有する予定がない限り、データベースファイルなど) のユーザーに対して非表示にする必要があるファイルは配置しないようにしてください。Even if an application doesn’t immediately enable file sharing, you should avoid placing files that should be hidden from your users in this directory (such as database files, unless you intend to share them). 機密ファイルが非表示のままであれば、将来のバージョンでファイル共有が有効になっていると、これらのファイルは公開されません (また、iTunes によって移動、変更、または削除される可能性があります)。As long as sensitive files remain hidden, these files will not be exposed (and potentially moved, modified, or deleted by iTunes) if file sharing is enabled in a future version.

Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) メソッドを使用して、アプリケーションの Documents ディレクトリへのパスを取得できます。You can use the Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) method to get the path to the Documents directory for your application.

このディレクトリの内容は、iTunes によってバックアップされます。The contents of this directory are backed up by iTunes.
ライブラリLibrary/ ライブラリディレクトリは、データベースやその他のアプリケーションで生成されたファイルなど、ユーザーによって直接作成されていないファイルを格納するのに適した場所です。The Library directory is a good place to store files that are not created directly by the user, such as databases or other application-generated files. このディレクトリの内容は、iTunes を介してユーザーに公開されることはありません。The contents of this directory are never exposed to the user via iTunes.

独自のサブディレクトリをライブラリに作成することができます。ただし、ここでは、ユーザー設定やキャッシュなど、システムによって作成されたディレクトリがいくつか存在します。You can create your own subdirectories in Library; however, there are already some system-created directories here that you should be aware of, including Preferences and Caches.

このディレクトリの内容 (キャッシュサブディレクトリを除く) は、iTunes によってバックアップされます。The contents of this directory (except for the Caches subdirectory) are backed up by iTunes. ライブラリに作成したカスタムディレクトリがバックアップされます。Custom directories that you create in Library will be backed up.
ライブラリ/設定/Library/Preferences/ アプリケーション固有の基本設定ファイルは、このディレクトリに格納されます。Application-specific preference files are stored in this directory. これらのファイルは直接作成しないでください。Do not create these files directly. 代わりに、NSUserDefaults クラスを使用します。Instead, use the NSUserDefaults class.

このディレクトリの内容は、iTunes によってバックアップされます。The contents of this directory are backed up by iTunes.
ライブラリ/キャッシュ/Library/Caches/ キャッシュディレクトリは、アプリケーションの実行に役立つデータファイルを格納するのに適した場所ですが、簡単に再作成することができます。The Caches directory is a good place to store data files that can help your application run, but that can be easily re-created. アプリケーションでは、必要に応じてこれらのファイルを作成および削除する必要があり、必要に応じてこれらのファイルを再作成することができます。The application should create and delete these files as needed and be able to re-create these files if necessary. iOS 5 では、これらのファイル (記憶域が不足している場合) も削除される場合がありますが、アプリケーションの実行中は削除されません。iOS 5 may also delete these files (under low storage situations), however it will not do so while the application is running.

このディレクトリの内容は iTunes によってバックアップされません。つまり、ユーザーがデバイスを復元しても、更新されたバージョンのアプリケーションがインストールされた後には存在しない可能性があることを意味します。The contents of this directory are NOT backed up by iTunes, which means they will not be present if the user restores a device, and they may not be present after an updated version of your application is installed.

たとえば、アプリケーションがネットワークに接続できない場合は、キャッシュディレクトリを使用してデータまたはファイルを格納し、適切なオフラインエクスペリエンスを実現することができます。For instance, in case your application can't connect to the network, you might use the Caches directory to store data or files to provide a good offline experience. このアプリケーションでは、ネットワーク応答の待機中にこのデータをすばやく保存して取得できますが、バックアップする必要はなく、復元やバージョンの更新後に簡単に回復または再作成することができます。The application can save and retrieve this data quickly while waiting for network responses, but it doesn’t need to be backed up and can easily be recovered or re-created after a restore or version update.
tmptmp/ アプリケーションは、このディレクトリ内の短時間のみ必要な一時ファイルを格納できます。Applications can store temporary files that are only needed for a short period in this directory. 領域を節約するには、不要になったファイルを削除する必要があります。To conserve space, files should be deleted when they are no longer required. オペレーティングシステムは、アプリケーションが実行されていない場合に、このディレクトリからファイルを削除することもあります。The operating system may also delete files from this directory when an application is not running.

このディレクトリの内容は、iTunes によってバックアップされません。The contents of this directory are NOT backed up by iTunes.

たとえば、tmp ディレクトリは、ユーザーに表示するためにダウンロードされる一時ファイル (Twitter アバターや電子メールの添付ファイルなど) を格納するために使用されますが、表示された後に削除される可能性があります (今後必要になった場合は、再度ダウンロードされます).For example, the tmp directory might be used to store temporary files that are downloaded for display to the user (such as Twitter avatars or email attachments), but that could be deleted once they've been viewed (and downloaded again if they are required in the future).

このスクリーンショットは、Finder ウィンドウのディレクトリ構造を示しています。This screenshot shows the directory structure in a Finder window:

プログラムによる他のディレクトリへのアクセスAccessing other directories programmatically

以前のディレクトリとファイルの例では、Documents ディレクトリにアクセスしています。The earlier directory and file examples accessed the Documents directory. 別のディレクトリに書き込むには、次に示すように "." 構文を使用してパスを作成する必要があります。To write to another directory, you must construct a path using the ".." syntax as shown here:

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

ディレクトリの作成も同様です。Creating a directory is similar:

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

Caches ディレクトリと tmp ディレクトリへのパスは次のように構築できます。Paths to the Caches and tmp directories can be constructed like this:

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

ファイルアプリと共有するSharing with the Files app

iOS 11では、ファイルアプリが導入されました。これは、ユーザーが iCloud でファイルを表示して操作したり、それをサポートするアプリケーションによって保存したりできるようにする、ios 用のファイルブラウザーです。iOS 11 introduced the Files app - a file browser for iOS that allows the user to see and interact with their files in iCloud and also stored by any application that supports it. ユーザーがアプリ内のファイルに直接アクセスできるようにするには、次のように、ファイル LSSupportsOpeningDocumentsInPlace に新しいブール値のキーを作成し、trueに設定します。To allow the user to directly access files in your app, create a new boolean key in the Info.plist file LSSupportsOpeningDocumentsInPlace and set it to true, as here:

LSSupportsOpeningDocumentsInPlace の設定

これで、アプリのDocumentsディレクトリがFilesアプリで閲覧できるようになります。The app's Documents directory will now be available for browsing in the Files app. ファイルアプリで、 [マイ iPhone] のに移動します。共有ファイルがある各アプリが表示されます。In the Files app, navigate to On My iPhone and each app with shared files will be visible. 次のスクリーンショットは、 FileSystem サンプルアプリの外観を示しています。The screenshots below show what the FileSystem sample app looks like:

iOS 11 ファイルアプリ IPhone ファイルを参照する サンプルアプリファイル

ITunes を使用してユーザーとファイルを共有するSharing files with the user through iTunes

ユーザーは、次に示すように、Info.plist を編集し、ソースビューで iTunes 共有 (UIFileSharingEnabled) エントリをサポートするアプリケーションを作成することによって、アプリケーションの Documents ディレクトリ内のファイルにアクセスできます。Users can access the files in your application’s Documents directory by editing Info.plist and creating an Application that supports iTunes sharing (UIFileSharingEnabled) entry in the Source view, as shown here:

アプリケーションの追加iTunes 共有プロパティをサポートするAdding the Application supports iTunes sharing property

これらのファイルには、デバイスが接続されていて、ユーザーが [Apps] タブを選択すると、iTunes でアクセスできます。たとえば、次のスクリーンショットは、選択したアプリ内のファイルが iTunes 経由で共有されていることを示しています。These files can be accessed in iTunes when the device is connected and the user chooses the Apps tab. For example, the following screenshot shows the files in selected app shared via iTunes:

このスクリーンショット、選択したアプリ内のファイルが iTunes 経由で共有されていることを示しますThis screenshot shows the files in selected app shared via iTunes

ユーザーは、iTunes を使用して、このディレクトリ内の最上位レベルの項目にのみアクセスできます。Users can only access the top-level items in this directory via iTunes. サブディレクトリの内容を表示することはできません (ただし、それらをコンピューターにコピーしたり、削除したりすることはできます)。They cannot see the contents of any subdirectories (although they can copy them to their computer or delete them). たとえば、GoodReader を使用すると、PDF ファイルと EPUB ファイルをアプリケーションと共有して、ユーザーが自分の iOS デバイスで読み取ることができるようにすることができます。For example, with GoodReader, PDF and EPUB files can be shared with the application so that users can read them on their iOS devices.

ドキュメントフォルダーの内容を変更すると、ユーザーが注意を払っていない場合、問題が発生する可能性があります。Users who modify the contents of their Documents folder can cause problems if they’re not careful. アプリケーションはこのことを考慮し、ドキュメントフォルダーの破壊的な更新に対して回復力を持つ必要があります。Your application should take this into consideration and be resilient to destructive updates of the Documents folder.

この記事のサンプルコードでは、Documents フォルダー ( SampleCode.cs) にファイルとフォルダーの両方を作成し、ファイル共有を有効にします The sample code for this article creates both a file and a folder in the Documents folder (in SampleCode.cs) and enables file sharing in the Info.plist file. このスクリーンショットは、iTunes でこれらがどのように表示されるかを示しています。This screenshot shows how these appear in iTunes:

このスクリーンショット、ファイルが iTunes でどのように表示されるかを示します。This screenshot shows how the files appear in iTunes

アプリケーションのアイコンを設定する方法と、作成するカスタムドキュメントの種類については、「イメージの操作」を参照してください。Refer to the Working with Images article for information about how to set icons for the application and for any custom document types you create.

UIFileSharingEnabled キーが false であるか存在しない場合、ファイル共有は既定で無効になり、ユーザーはドキュメントディレクトリと対話できません。If the UIFileSharingEnabled key is false or not present, then file sharing is, by default, disabled, and users will not be able to interact with your Documents directory.

バックアップと復元Backup and restore

デバイスが iTunes によってバックアップされると、アプリケーションのホームディレクトリに作成されたすべてのディレクトリが保存されます。ただし、次のディレクトリは除きます。When a device is backed up by iTunes, all the directories created in your application’s home directory will be saved except the following directories:

  • [ApplicationName]。アプリ–署名されているため、このディレクトリには書き込みません。そのため、インストール後に変更を残しておく必要があります。[ApplicationName].app – Don't write to this directory, since it’s signed and so must remain unchanged after installation. このファイルには、コードからアクセスするリソースが含まれている場合がありますが、アプリを再ダウンロードすることによって復元されるため、バックアップは必要ありません。It may contain resources that you access from your code, but they do not require backup since they would be restored by re-downloading the app.
  • ライブラリ/キャッシュ-キャッシュディレクトリは、バックアップする必要のない作業ファイルを対象としています。Library/Caches – The cache directory is intended for working files that do not need to be backed up.
  • tmp –このディレクトリは、不要になったときに作成および削除された一時ファイルや、容量が必要なときに iOS が削除するファイルに使用されます。tmp – This directory is used for temporary files that are created and deleted when no longer needed, or for files that iOS deletes when it needs space.

大量のデータをバックアップすると、長い時間がかかることがあります。Backing up a large amount of data can take a long time. 特定のドキュメントまたはデータをバックアップする必要がある場合は、アプリケーションで [ドキュメントとライブラリ] フォルダーのいずれかを使用する必要があります。If you decide you need to back up any particular document or data, your application should use either use the Documents and Library folders. ネットワークから簡単に取得できる一時的なデータまたはファイルの場合は、キャッシュまたは tmp ディレクトリを使用します。For transient data or files that can be easily retrieved from the network, use either the Caches or the tmp directory.

注意

iOS では、デバイスのディスク領域が非常に少なくなったときに、ファイルシステムが "クリーン" されます。iOS will ‘clean’ the filesystem when a device runs critically low on disk space. このプロセスでは、現在実行されていないアプリケーションのライブラリ/キャッシュおよび tmp フォルダーからすべてのファイルが削除されます。This process will remove all files from the Library/Caches and tmp folder of applications that are not currently running.

IOS 5 iCloud のバックアップ制限への準拠Complying with iOS 5 iCloud backup restrictions

注意

このポリシーは最初に iOS 5 で導入されていましたが (これはかなり前のように見えます)、現在もアプリに関連しています。Although this policy was first introduced with iOS 5 (which seems like a long time ago) the guidance is still relevant to apps today.

Apple では、iOS 5 でICloud バックアップ機能が導入されました。Apple introduced iCloud Backup functionality with iOS 5. ICloud バックアップが有効になっている場合、アプリケーションのホームディレクトリ内のすべてのファイル (通常はバックアップされていないディレクトリ (アプリバンドル、Cachestmpなど) は iCloud サーバーにバックアップされます。When iCloud Backup is enabled, all the files in your application’s home directory (excluding directories that are not normally backed up, e.g., the app bundle, Caches, and tmp) are backed-up to iCloud servers. この機能により、デバイスが紛失、盗難、または破損した場合に備えて、完全なバックアップをユーザーに提供できます。This feature provides the user with a complete backup in case their device is lost, stolen, or damaged.

ICloud では、各ユーザーに 5 Gb の空き領域を提供するだけで、帯域幅を不必要に使用しないようにするために、アプリケーションではユーザーが基本的に生成したデータのみをバックアップすることを想定しています。Because iCloud only provides 5 Gb of free space to each user and to avoid unnecessarily using bandwidth, Apple expects applications to only backup essential user-generated data. IOS データストレージのガイドラインに準拠するには、次の項目に従うことで、バックアップされるデータの量を制限する必要があります。To comply with the iOS Data Storage Guidelines, you should limit the amount of data that gets backed up by adhering to the following items:

  • ユーザーが生成したデータまたは再作成できないデータだけを Documents ディレクトリ (バックアップ対象) に格納します。Only store user-generated data, or data that cannot otherwise be re-created, in the Documents directory (which is backed-up).
  • Library/Caches または tmp で簡単に再作成または再ダウンロードできるその他のデータを保存します (これはバックアップされず、"クリーニング済み" になる場合があります)。Store any other data that can easily be re-created or re-downloaded in Library/Caches or tmp (which is not backed-up, and could be ‘cleaned’).
  • Library/Caches または tmp フォルダーに適切なファイルがあっても、"クリーニング" したくない場合は、ファイルを別の場所 (Library/YourDataなど) に保存して、"バックアップしない" 属性を適用して、ファイルが iCloud バックアップ帯域幅と stora を使用しないようにします。ge space。If you have files that might be appropriate for the Library/Caches or tmp folder but you do not want to be ‘cleaned’ out, store them elsewhere (such as Library/YourData) and apply the ‘do not back up’ attribute to prevent the files from using up iCloud Backup bandwidth and storage space. このデータはデバイスの空き領域を維持するため、慎重に管理し、可能な場合は削除する必要があります。This data still uses up space on the device, so you should manage it carefully and delete it when possible.

"バックアップしない" 属性は、NSFileManager クラスを使用して設定されます。The ‘do not back up’ attribute is set using the NSFileManager class. クラスが using Foundation ことを確認し、次のように SetSkipBackupAttribute を呼び出します。Ensure your class is using Foundation and call SetSkipBackupAttribute like this:

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

SetSkipBackupAttributetrue 場合、ファイルは、格納されているディレクトリ (Documents ディレクトリも含む) に関係なく、バックアップされません。When SetSkipBackupAttribute is true the file will not be backed-up, regardless of the directory it is stored in (even the Documents directory). GetSkipBackupAttribute メソッドを使用して属性に対してクエリを実行し、次のように falseSetSkipBackupAttribute メソッドを呼び出すことによって、この属性をリセットできます。You can query the attribute using the GetSkipBackupAttribute method, and you can reset it by calling the SetSkipBackupAttribute method with false, like this:

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

IOS アプリとアプリ拡張機能間でのデータの共有Sharing data between iOS apps and app extensions

アプリ拡張機能はホストアプリケーションの一部として (それを含むアプリではなく) 実行されるため、データの共有は自動的に含まれないため、余分な作業が必要になります。Since App Extensions run as part of a host application (as opposed to their containing app), the sharing of data isn't automatic included so extra work is required. アプリグループは、さまざまなアプリでデータを共有するために iOS が使用するメカニズムです。App Groups are the mechanism iOS uses to allow different apps to share data. アプリケーションが正しい権利とプロビジョニングで適切に構成されている場合は、通常の iOS サンドボックスの外部にある共有ディレクトリにアクセスできます。If the applications have been properly configured with the correct entitlements and provisioning, they can access a shared directory outside of their normal iOS sandbox.

アプリグループを構成するConfigure an App Group

共有の場所は、 IOS デベロッパーセンターの「証明書、識別子 & プロファイル」セクションで構成されているアプリグループを使用して構成されます。The shared location is configured using an App Group, which is configured in the Certificates, Identifiers & Profiles section on iOS Dev Center. この値は、各プロジェクトの権利でも参照される必要があります。 plistです。This value must also be referenced in each project's Entitlements.plist.

アプリグループの作成と構成の詳細については、アプリグループの機能に関するガイドを参照してください。For information on creating and configuring an App Group, refer to the App Group Capabilities guide.

ファイルFiles

IOS アプリと拡張機能は、共通のファイルパスを使用してファイルを共有することもできます (正しい権利とプロビジョニングで適切に構成されている場合)。The iOS app and the extension can also share files using a common file path (given they have been properly configured with the correct entitlements and provisioning):

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

重要

返されたグループパスが null場合は、権利とプロビジョニングプロファイルの構成を確認し、正しいことを確認します。If the Group Path returned is null, check the configuration of the entitlements and the provisioning profile and make sure that they are correct.

アプリケーションのバージョンの更新Application version updates

アプリケーションの新しいバージョンがダウンロードされると、iOS は新しいホームディレクトリを作成し、そのディレクトリに新しいアプリケーションバンドルを格納します。When a new version of your application is downloaded, iOS creates a new home directory and stores the new Application Bundle in it. iOS は、以前のバージョンのアプリケーションバンドルから、次のフォルダーを新しいホームディレクトリに移動します。iOS then moves the following folders from the previous version of your Application Bundle to your new home directory:

  • ドキュメントDocuments
  • LibraryLibrary

他のディレクトリはコピーして新しいホームディレクトリに配置することもできますが、コピーされることは保証されないため、アプリケーションはこのシステムの動作に依存しないようにする必要があります。Other directories may also be copied across and put under your new home directory, but they’re not guaranteed to be copied, so your application should not rely on this system behavior.

まとめSummary

この記事では、Xamarin を使用したファイルシステム操作が他の .NET アプリケーションと似ていることを示しました。This article showed that file system operations with Xamarin.iOS are similar to any other .NET application. また、アプリケーションサンドボックスを導入し、その原因となったセキュリティへの影響を調べました。It also introduced the Application Sandbox and examined the security implications that it causes. 次に、アプリケーションバンドルの概念について説明します。Next, it explored the concept of an Application Bundle. 最後に、アプリケーションで使用可能な特化されたディレクトリを列挙し、アプリケーションのアップグレード時およびバックアップ時にそのロールを説明しました。Finally, it enumerated the specialized directories available to your application and explained their roles during application upgrades and backups.