xyk blog

最近は iOS 開発の記事が多めです。

Swift でフォトライブラリに UIImage を保存する

検証環境:
Xcode 11.4
Swift 5.2

Photos.framework を使って フォトライブラリに UIImage 画像を jpeg または png で保存する方法です。

まず Info.plist に使用目的を追加します。

<key>NSPhotoLibraryUsageDescription</key>
<string>フォトライブラリの写真を利用します。</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>フォトライブラリに写真を追加します。</string>

import

import Photos

保存のコードサンプルです。
フォトライブラリへのアクセス許諾状態を事前にチェックします。

if PHPhotoLibrary.authorizationStatus() == .authorized {
    saveImage(image)
} else {
    PHPhotoLibrary.requestAuthorization { [weak self] status in
        switch status {
        case .authorized: // 許諾済み
            self?.saveImage(image)
        case .denied: // 拒否済み
            DispatchQueue.main.async {
                // アラートを表示して設定画面へ誘導する
            }
        case .notDetermined: // 許諾未確認
            break
        case .restricted: // 制限中
            break
        @unknown default:
            break
        }
    }
}

jpeg で保存する場合です。
PHAssetChangeRequestを使って保存します。

private func saveImage(_ image: UIImage) {
    PHPhotoLibrary.shared().performChanges({
        PHAssetChangeRequest.creationRequestForAsset(from: image)
    }) { [weak self] (success, error) in
        DispatchQueue.main.async {
            if let error = error {
                // エラーのアラート表示
            } else {
                // 保存完了のアラート表示
            }
        }
    }
}

png で保存する場合です。
UIImage -> Data に変換し、PHAssetCreationRequestを使って保存します。
以前は UIImagePNGRepresentation(image) で変換していましたが、現在は .pngData() でできるようになりました。

private func saveImage(_ image: UIImage) {
    PHPhotoLibrary.shared().performChanges({
        let creationRequest = PHAssetCreationRequest.forAsset()
        let option = PHAssetResourceCreationOptions()
        creationRequest.addResource(with: .photo, data: image.pngData()!, options: option)
    }) { [weak self] (success, error) in
        DispatchQueue.main.async {
            if let error = error {
                // エラーのアラート表示
            } else {
                // 保存完了のアラート表示
            }
        }
    }
}