【Swift】ファイルアプリからDocumentsフォルダへアクセス許可する方法!
この記事からわかること
- Swiftで作成したiOSアプリのDocumentsフォルダへデバイス標準装備の「ファイル」アプリからアクセスする方法
- UIFileSharingEnabledキーとLSSupportsOpeningDocumentsInPlaceキーの意味
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
iOS11以降からアプリ内から操作できるDocumentsフォルダがファイルアプリを通じてアクセスできるようになりました。その設定方法や操作方法をまとめていきます。
iOSアプリのファイルシステム
そもそもiOSアプリではアプリ内で生成したファイルなどをサンドボックス構造になっているファイルシステムの中に保存しています。サンドボックス構造になっていることで外部との繋がりが遮断され不正なアクセスを防ぐことができています。
おすすめ記事:iOSのファイルシステム:サンドボックス構造とは?
ファイルシステム
├── AppData
│ ├── Documents
│ ├── Library
│ ├── Application Support
│ ├── Caches
│ ├── Preferences
│ ├── Saved Application State
│ └── SplashBoard
│ ├── SystemData
│ └── tmp
ファイルシステムの中には役割ごとにディレクトリが分けられており、それぞれに格納するファイルもガイドラインによって定義されています。
参考文献:FileSystem Programming Guide
ですがiOS11以降からDocumentsフォルダへデバイス標準装備の「ファイル」アプリからアクセスすることができるようになりました。
ファイルアプリからDocumentsフォルダへアクセス許可する方法
アクセスを許可するためには「info.plist」に以下2つのキーを追加し値に「Yes」を渡します。
- UIFileSharingEnabled (Application supports iTunes file sharing)
- LSSupportsOpeningDocumentsInPlace (Supports opening documents in place)
アプリがiTunesを介してファイルを共有するかどうかを指定するキー。
LSSupportsOpeningDocumentsInPlace
ファイルアプリからDocumentsのコピーではなく元のDocumentsを開くことを許可するか指定するキー。
これでファイルアプリから設定したアプリのDocumentsフォルダにアクセスできるようになりました。しかしDocumentsフォルダ内にファイルが存在しない場合は表示されないようなのでファイルを生成して確認してみます。
Documentsフォルダ内にファイルを生成して確認する
Documentsフォルダ内にファイルを生成するにはFileManager
クラスを使用します。ここでは使用方法は解説しませんので以下の記事を参考にしてください。
おすすめ記事:【Swift】FileManagerでファイルを保存!操作方法や格納場所
以下はコピペで動作しますので試しにボタンを押してファイルを生成しファイルアプリから存在するかチェックしてみてください。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton()
button.frame = CGRect(x: 0, y:0, width: 100 , height: 100)
button.backgroundColor = .orange
button.center = self.view.center
button.addTarget(self, action: #selector(createFile), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func createFile() {
let fileManager = FileManager.default
let docPath = NSHomeDirectory() + "/Documents"
let filePath = docPath + "/sample.txt"
if !fileManager.fileExists(atPath: filePath) {
fileManager.createFile(atPath:filePath, contents: nil, attributes: [:])
}else{
print("既に存在します。")
}
}
}
シミュレーター内の「ファイル」アプリから、「このiPhone内」>「アプリ名」>「ファイル名」を確認し以下のように生成したファイルを確認できれば成功です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。