LoginSignup
7
2

More than 1 year has passed since last update.

【Swift】PHPhotoLibraryでフォトライブラリを実装する方法

Last updated at Posted at 2021-12-01

実装コード

iOS 14からPHPhotoLibrary.authorizationStatus()の引数に.readWrite.addonlyの指定が必要になりました。
そこで、フォトライブラリの開き方を備忘録としてまとめました。
実装したalbumActionメソッドを使用するとフォトライブラリが開けます。

info.plistPrivacy – Photo Library Usage Descriptionの追加も忘れないように!

import Photos

private func albumAction() {
    // 端末にアルバムがあるかを確認
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) {
        if #available(iOS 14, *) {
            // iOS14以降の設定
            let authorizationStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite)
            self.albumCommonAction(authorizationStatus)
        } else {
            // iOS14より前の設定
            let authorizationStatus = PHPhotoLibrary.authorizationStatus()            
            self.albumCommonAction(authorizationStatus)
        }
    }
}

private func albumCommonAction(_ authorizationStatus: PHAuthorizationStatus) {
    // フォトライブラリを使う準備
    let photoLibraryPicker = UIImagePickerController()
    photoLibraryPicker.sourceType = .photoLibrary
    photoLibraryPicker.delegate = self

    switch authorizationStatus {
    case .notDetermined:
        // 初回起動時アルバムアクセス権限確認
        PHPhotoLibrary.requestAuthorization { status in
            switch status {
                case .authorized:
                    // アクセスを許可するとカメラロールが出てくる
                    DispatchQueue.main.async {
                        self.present(photoLibraryPicker, animated: true)
                    }
                default:
                    break
            }
        }
    case .denied:
        // アクセス権限がないとき
        let alert = UIAlertController(title: "", message: "写真へのアクセスを許可してください", preferredStyle: .alert)
        let settingsAction = UIAlertAction(title: "設定", style: .default, handler: { (_) -> Void in
            guard let settingsURL = URL(string: UIApplication.openSettingsURLString ) else {
                return
            }
            UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
         })
        let closeAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
        alert.addAction(settingsAction)
        alert.addAction(closeAction)
        self.present(alert, animated: true, completion: nil)
    case .authorized, .restricted, .limited:
        // アクセス権限があるとき
        self.present(photoLibraryPicker, animated: true)
    @unknown default:
        break
    }
}

Limited Photos Libraryの利用

iOS 14からはLimited Photos Libraryが使えるようになり、ユーザが選択した写真のみしかアプリからアクセスできない状態を作ることができます。
(「写真を選択...」の項目がiOS14から追加)

ogp.jpeg

ただ、ここでアクセスを許可した写真を一覧で開けるようなものがOS標準でなさそう...
現時点では、自前で実装するかライブラリを使うかして実装しないといけない
MosaiqueAssetsPicker

参考

WWDC2020での許諾周りのアップデートまとめ

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2