SwiftでDocumentsフォルダに保存した画像を表示する方法

  •  

 

これ、たくさんサンプルとか、これに関する記事があると思うが。
最新OS(iOS14.8以降)だと、アプリ再起動時に取得できなくなるので。
原因はDocumentsフォルダのパスが可変の為。

画像の取得・表示はUIImagePickerControllerを使用。
返ってきたimageをpng等々でDocumentsフォルダに保存。
そのパスを永続化(Realm)している。

で、他のサイト等々は、保存時に取得したDocumentsフォルダのパス毎保存している。
これで画像を表示しようとすると、パスが変わるので、あるタイミング(アプリの再起動等)で表示できなくなる。

やってることは単純で、一意のファイル名のみDBに保存して、表示するタイミングであらためてDocumentsフォルダのパスを取得。
それで表示してるだけ。

多分OSののバージョンアップでセキュリテイの関係でDocumentsフォルダのパスが可変になったのかな?
若干ハマったので書いておきました。
ソースは以下。

ここでDokumentsフォルダのパスを取得。

    func getDocumentsURL() -> NSURL {
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
        return documentsURL
    }

UIImagePickerControllerで取得した画像のファイル名を一意にする為のメソッド。
UUIDで一意にしても良いかも。
※この値のみをDBに保存する(Dokumentsフォルダのパスは可変なので保存しないこと!)

    func getFileName(exten: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyyMMddHHmmss"
        return dateFormatter.string(from: Date()) + exten
    }

保存した画像を表示する為のメソッド。
DB(Realm)で保存しているのは引数のfileNameのみ。
保存したファイル名を渡すと、Dokumentsフォルダのパスとファイル名をくっつけて、返すメソッド。

    func getFileInDocumentsDirectory(fileName: String) -> String {
        let fileURL = getDocumentsURL().appendingPathComponent(fileName)
        return fileURL!.path
    }

これで問題無くいけると思います。
若干ハマったので備忘録を兼ねて。

株式会社woodsmallの小林でした。
https://woodsmall.co.jp/

関連記事

コメント

この記事へのコメントはありません。

TOP