検証環境:
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 { // 保存完了のアラート表示 } } } }