【Swift4】PhotosFrameworkでマイアルバムにアルバムを作成する方法

2020年8月29日

PhotosFrameworkにあるPHPhotoLibraryやPHAssetCollectionを使用して、写真アプリのマイアルバムにオリジナルのアルバムを作成する方法をご紹介します。

アルバムにオリジナルのアルバムを作成するには大きく分けて3つの工程があります。

  1.  Info.plistにPhoto Libraryの使用許可を追加する。
  2. Photo Libraryへのアクセス許可を要求する。
  3. マイアルバムにアルバムを作成する。

どれも簡単なのでサクッとできると思います!

写真アプリのアルバムにオリジナルのアルバムを作成する方法

1. Info.plistにPhoto Libraryの使用許可を追加する

Privacy - Photo Library Additions Usage Description
Privacy - Photo Library Usage Description

の2つを追加してPhoto Libraryへアクセス許可のポップアップにでる文言を設定します。

2. Photo Libraryへのアクセス許可を要求する

import Photos

まずPhotosFrameworkをインポートします。

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 写真使用の承認
    switch (PHPhotoLibrary.authorizationStatus()) {
    case .notDetermined: // フォトライブラリへのアクセスについてユーザーから明示的な回答を得ていない。
        print("notDetermined")
        
        PHPhotoLibrary.requestAuthorization({ status in
            switch status {
            case .notDetermined:
                print("notDetermined")
                break
            case .authorized:
                print("authorized")
                break
            case .denied:
                print("denied")
                break
            case .restricted:
                print("restricted")
                break
            }
        })
        
        break
    case .authorized: // フォトライブラリへのアクセスについてユーザーが明示的に「許可」をした。
        print("authorized")
        break
    case .denied: // フォトライブラリへのアクセスについてユーザーが明示的に「拒否」をした。
        print("denied")
        break
    case .restricted: // フォトライブラリへのアクセスが許可されておらず、ユーザーはそのような許可を与えることはできない状態。
        print("restricted")
        break
    }
}

次にPhoto Libraryへアクセス許可のポップアップを出す処理を記述します。

3.マイアルバムにアルバムを作成する

// アルバムの作成
func createNewAlbum(albumTitle: String, callback: @escaping (Bool) -> Void) {
    if self.albumExists(albumTitle: albumTitle) {
        callback(true)
    } else {
        PHPhotoLibrary.shared().performChanges({
            PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumTitle)
        }) { (isSuccess, error) in
            callback(isSuccess)
        }
    }
}
// アルバムが既にあるか確認
func albumExists(albumTitle: String) -> Bool {
    let albums = PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.album, subtype:
        PHAssetCollectionSubtype.albumRegular, options: nil)
    for i in 0 ..< albums.count {
        let album = albums.object(at: i)
        if album.localizedTitle != nil && album.localizedTitle == albumTitle {
            return true
        }
    }
    return false
}

アルバム作成のためのメソッドを2つ追加します。
1つはアルバム作成のメソッドで、もう一つはアルバムが既にあるか確認するためのメソッドです。

self.createNewAlbum(albumTitle: "MyAppName", callback: { (isSuccess) in
    if isSuccess {
        print("成功")
    }
    else {
        print("失敗")
    }
})

アルバムを使いたいタイミングで、上記のように使えばオリジナルのアルバムが作成できます。