これ、たくさんサンプルとか、これに関する記事があると思うが。
最新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/
コメント