iOS 11から自動でインストールされているファイルアプリ(Files App)のサイドバーにはこのiPhone/iPad内
(On My iPhone/iPad
)という項目があります。
この場所に自分のアプリのDocuments
フォルダを表示し、他のアプリと共有させる方法です。
Step.1
info.plist内に以下を追加し値をYES
にします。
-
UIFileSharingEnabled
(Application supports iTunes file sharing
) -
LSSupportsOpeningDocumentsInPlace
(Supports opening documents in place
)
Step.2
Documents
フォルダ内が空だとファイルアプリに表示されないので、適当にファイルを置きます。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let fm = FileManager.default
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
//let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = documentsPath + "/myfile.txt"
if !fm.fileExists(atPath: filePath) {
fm.createFile(atPath: filePath, contents: nil, attributes: [:])
}
}
}
注意点 1
LSSupportsOpeningDocumentsInPlace
をYES
にすると、他のアプリからUIActivityControllerなどでファイルを受け取るときにAppDelegateのapplication(_:open:options:)
が呼ばれます。もし、application(_:open:sourceApplication:annotation:) deprecated in iOS 9
を使っていた場合は、この組み合わせでクラッシュするのでapplication(_:open:options:)
に移行しましょう。
また、LSSupportsOpeningDocumentsInPlace
の説明にあるように共有などでコピーとして渡されていたURLを直接取りに行くようになるので、別途Bookmarks
と Security Scope
について処理する必要があります。
注意点 2
Documents
フォルダ内に晒したくないファイルがある場合は、Library
フォルダ直下のApplication Support
フォルダに移動させておきましょう。
let support = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
Application Support
が存在しない場合はどうめい作成します。
Application Support
フォルダはiCloud等でバックアップされますが、ユーザはiTunesアプリやファイルアプリから見ることができません。
iOS 10以降のCore Data
もデフォルトでApplication Support
フォルダにデータを保存するようになりました。
ファイルアプリのサイドバーにはiCloud DriveやDropBoxなどがありますが、ここに表示させたい場合はFile Provider Extension
を適切に設定する必要があるようです。