アプリケーション内のテキストファイルを読み書きする方法を解説します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.2.4
【iOS】13.7
【macOS】Catalina バージョン 10.15.6
サンプルソース
はじめにサンプルソースを示します。
「実行」ボタンを押すと、アプリケーションのDocumentsフォルダ内の"output.txt"ファイルに文字列を書き込みをし、その後同ファイルから内容を読み込むサンプルです。
実行ボタンはSwiftUIで実現していますが、ファイルの書き込みおよび読み込み処理にはSwiftUIの機能は使用していませんので、UIKitを使ったアプリでも流用可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import SwiftUI struct ContentView: View { var body: some View { Button("実行") { /// ファイル書き込み self.writingToFile(text: "カピ通信") /// ファイル読み込み /// 読み込んだファイルの内容を確認 print("【ファイル内容】\(self.readFromFile())") } } /// ファイル書き込みサンプル func writingToFile(text: String) { /// ①DocumentsフォルダURL取得 guard let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("フォルダURL取得エラー") } /// ②対象のファイルURL取得 let fileURL = dirURL.appendingPathComponent("output.txt") /// ③ファイルの書き込み do { try text.write(to: fileURL, atomically: true, encoding: .utf8) } catch { print("Error: \(error)") } } /// ファイル読み込みサンプル func readFromFile() -> String { /// ①DocumentsフォルダURL取得 guard let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("フォルダURL取得エラー") } /// ②対象のファイルURL取得 let fileURL = dirURL.appendingPathComponent("output.txt") /// ③ファイルの読み込み guard let fileContents = try? String(contentsOf: fileURL) else { fatalError("ファイル読み込みエラー") } /// ④読み込んだ内容を戻り値として返す return fileContents } } |
ファイル書き込み処理の解説
DocumentsフォルダURL取得
1 2 3 4 5 6 |
/// ①DocumentsフォルダURL取得 guard let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("フォルダURL取得エラー") } |
FileManager.default.urls()を使って、DocumentsフォルダURLを取得します。
引数(for)にはDocumentフォルダを示す.documentDirectoryを、引数(in)にはアプリのファイルが格納されているフォルダドメインを示す.userDomainMaskを指定します。
戻り値にはフォルダURLの配列が返るので、.firstをつけて先頭[0]の要素を取得します。
対象フォルダが取得できない場合はnilが戻りますので、その場合サンプルではfatalError()で強制的にアプリをクラッシュさせています。
FileManagerはファイルとディレクトリを管理するクラスです。
このクラスの1つのオブジェクトがアプリに割り当てられ、アプリのために予約されたストレージ スペース内のファイルやディレクトリを作成、削除、コピー、移動ができます。
このオブジェクトを参照するプロパティがFileManager.defaultです。
対象のファイルURL取得
1 2 3 4 |
/// ②対象のファイルURL取得 let fileURL = dirURL.appendingPathComponent("output.txt") |
フォルダURLにファイル名を追加して、ファイルURLとします。
ファイルに対しての操作は、このファイルURLを使用します。
ファイルの書き込み
1 2 3 4 5 6 7 8 |
/// ③ファイルの書き込み do { try text.write(to: fileURL, atomically: true, encoding: .utf8) } catch { print("Error: \(error)") } |
Stringに標準で用意されているwriteメソッドを使って、ファイルに書き込みを行います。
引数(to)には書き込むファイルのURLを指定します。ファイルが存在しない場合は、生成されます。
引数(atomically)は、元のファイルが破損しないようにするために、データを最初に補助ファイルに保存するかどうかをBool値で指定します (true推奨)。
引数(encoding)は、文字列を生成するために使用されるエンコーディングタイプを指定します。
特別な事情が無い場合は、utf8にしておけば問題ありません。
このメソッドは、書き込みできない場合にエラーを返す為、do-try-catchでエラーハンドリングをしています。
ファイル読み込み処理の解説
①DocumentsフォルダURL取得、②対象のファイルURL取得はファイル書き込み処理と同様です。
ファイルの読み込み
1 2 3 4 5 6 |
/// ③ファイルの読み込み guard let fileContents = try? String(contentsOf: fileURL) else { fatalError("ファイル読み込みエラー") } |
特別なイニシャライザであるString(contentsOf :)を使用して、ファイルの内容を文字列にロードします。
このイニシャライザはロードできない場合にエラーを返す為、tryまたはtry?を使用して呼び出す必要があります。
fileContentsへの読み込みが成功したら、以降は通常の文字列として好きなように使用できます。
iOSアプリのフォルダ構成
iOSアプリのフォルダ構成について解説します。
Documents
ユーザーが作成したファイル、あるいはアプリケーションで再作成できないドキュメントやその他データ(画像、動画など)を保存するフォルダです。
Core DataのDBファイルもここに作成されます。
このフォルダに置いたファイルは、iTunes/iCloudにバックアップされます。
上記に該当しないファイル(キャッシュデータなど)を置いた場合、AppStoreの審査でリジェクトになる場合があります。
Documents/Inbox
他のアプリから受け取ったファイルが保存されるフォルダです。
ファイルの読み込みと削除のみができ、書き込みはできません。
このフォルダ上のファイルは、iTunes/iCloudにバックアップされます。
Library
Documentフォルダに入れるようなデータ以外を保存するフォルダです。
UserDefaultsに保存したデータは、plistとしてこのフォルダ配下に保存されます。
このフォルダ配下に置いたファイルの内、Chacheフォルダ以外はiTunes/iCloudにバックアップされます。
Library/Caches
再度ダウンロードまたは再生成できるデータを保存するフォルダです。
例として、データベースのキャッシュファイルや、雑誌、新聞、地図のアプリケーションで使用されるようなダウンロード可能なコンテンツなどが含まれます。
このフォルダはiTunes/iCloudにバックアップされません。
tmp
一時的にのみ使用されるデータを保存するフォルダです。
ファイルを使い終わったら必ず削除するようにして下さい。
アプリが起動していない時に、システムによって自動削除される可能性があります。
このフォルダはiTunes/iCloudにバックアップされません。
フォルダの中身を見る方法
XcodeのメニューからWindows>Devices and Simulators を選択し、次の画面を開きます。
- DevicesかSimulatorsを選択
- 対象の端末を選択
- 対象のアプリを選択
- 歯車アイコンをクリック
次のメニューが開くので、Download Containerを選択し、フォルダコンテナをMacにダウンロードします。
ダウンロードしたファイルを右クリックし「パッケージの内容を表示」するとフォルダの内容が確認できます。
ファイルアプリからDocumentsフォルダにアクセスする
iOS11以降で搭載されたiOS標準の「ファイルアプリ」を使うと、アプリのDocumentsフォルダにあるファイルを直接閲覧、編集、コピー等できます。
ファイルアプリからアクセスを許可するには、info.plistの設定が必要です。
info.plistの設定
- Project navigatorでプロジェクト名をクリック
- TARGETSを選択
- infoをクリック
- 次の2行を追加し、ValueをYESにする
- Application supports iTunes file sharing
- Supports opening documents in place
設定後アプリをコンパイルすると、ファイルアプリからアクセス可能になります。
ファイルアプリからのアクセス手順
- ファイルアプリをタップ
- タブメニューの「Browse」をタップ
- On My iPhoneをタップ
- アクセス可能なアプリ一覧が表示される。対象アプリをタップ
- Documentsフォルダのファイル一覧が表示される。ファイルをタップ。
- ファイルの内容が表示される。
あわせて読みたい記事

