【Swift, iOS】UIActivityViewControllerを使用してファイルをiCloud Driveなどのアプリ外に保存する

前回はアプリ外のファイルを読み込む場合の話だったが、今回は、アプリ外にファイルを保存する場合の話

Androidだと普通にできる(簡単とは言っていない)ため、iOSでも割と需要はあると思うのだが、それっぽいキーワードで検索しても出てこなかったためメモ

アプリ外へのファイル保存はいわゆる「共有」で使われるUIActivityViewControllerを使用する(Androidで言うと暗黙的Intent的なやつ)

以下は例としてDocumentディレクトリに保存したファイルをアプリ外に保存する処理のソースコード

func fileSave(fileName: String) {
    let dir = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask ).first!
    let filePath = dir.appendingPathComponent(fileName, isDirectory: false);
    let controller = UIActivityViewController.init(activityItems: [filePath], applicationActivities: nil)
    controller.excludedActivityTypes = [
        .addToReadingList,
        .airDrop,
        .assignToContact,
        .copyToPasteboard,
        .mail,
        .markupAsPDF,
        .message,
        .openInIBooks,
        .postToFacebook,
        .postToFlickr,
        .postToTencentWeibo,
        .postToTwitter,
        .postToVimeo,
        .postToWeibo,
        .print,
        .saveToCameraRoll
    ]
    self.present(controller, animated: true, completion: nil)
}

excludedActivityTypesは除外したい共有先で、今回はファイル保存以外を出来るだけ消したいのでとりあえず定義してあるものを全部を指定しているが、SNSへの共有などを許可したいのであれば要変更

これに正しいファイル名を渡して呼ぶと以下の画像のように表示される

IMG_0004

この中からファイルに保存を選択するとiCloud Driveなどの保存先を選んでファイルを保存することができる

ただし、基本的には共有用のものであり、ユーザー側で他のものを選択されてしまうと保存ができないので、アプリ側である程度ナビゲートするようにした方が良いかもしれない

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です