iOS 11ファイルAppにDocumentsフォルダを表示して他のアプリと共有する方法


iOS 11から自動でインストールされているファイルアプリ(Files App)のサイドバーにはこのiPhone/iPad内(On My iPhone/iPad)という項目があります。
この場所に自分のアプリのDocumentsフォルダを表示し、他のアプリと共有させる方法です。

Step.1

info.plist内に以下を追加し値をYESにします。

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

LSSupportsOpeningDocumentsInPlaceYESにすると、他のアプリからUIActivityControllerなどでファイルを受け取るときにAppDelegateのapplication(_:open:options:)が呼ばれます。もし、application(_:open:sourceApplication:annotation:) deprecated in iOS 9を使っていた場合は、この組み合わせでクラッシュするのでapplication(_:open:options:)に移行しましょう。

また、LSSupportsOpeningDocumentsInPlaceの説明にあるように共有などでコピーとして渡されていたURLを直接取りに行くようになるので、別途BookmarksSecurity 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を適切に設定する必要があるようです。

参考

Working with the Files App in iOS 11
Apple: File Provider