Permission Scope で写真のパーミッションを再取得する


アプリがユーザーの写真にアクセスするにはパーミッションを取得する必要があります。
このとき パーミッションをいちど拒否されると再許可してもらうには設定アプリを階層深くまで辿ってもらわねばなりません。

しかし Permission Scope を使うと 再許可までカンタンにナビゲーションできます。

Permission Scope とは

PermissionScope is a Swift framework for intelligently requesting permissions from users.It contains not only a simple UI to request permissions but also a unified permissions API that can tell you the status of any given system permission or easily request them.
https://github.com/nickoneill/PermissionScope

パーミッション取得をカンタンにしてくれるのが Permission Scope です。
さまざまなパーミッションを取得するのに統一された API を提供してくれます。

インストールは CocoaPods と Carthage で出来ます。

パーミッションを取得する

README を読んでサンプルを書いてみました。
ビューにある imagePickerボタンを押すことで 下記の IBAction を起動しています:

    @IBAction func imagePickerButtonTapped(sender: AnyObject) {
        let permissions = PermissionScope()
        // ダイアログの表示に self(ViewController) を使う
        permissions.viewControllerForAlerts = self
        // 設定アプリ遷移後にパーミッションの設定が変わったときにコールバックされる
        permissions.onAuthChange = { [unowned self] (finished, results) in
            if results[0].status == .Authorized {  //再許可とれた
                self.presentImagePickerController()//ImagePickerController 起動
            }
        }

        switch permissions.statusPhotos() {  // 写真のパーミッションをチェック
        case .Authorized: // すでに写真へのアクセスを許可済みのとき
            presentImagePickerController()   // ImagePickerController 起動
        case .Unknown, .Unauthorized, .Disabled:
        // Unknown: パーミッション未設定, Unauthorized: アクセス拒否, 
        // Disabled: システムレベルで無効
            permissions.requestPhotos()  // 未設定やいちど拒否されたときは
                                         // 再度問い合わせする
        }
    }

requestPhotos メソッドのなかでは いまのパーミッションに応じたダイアログを表示してくれます。
たとえば 写真へのアクセスをいちど拒否したあとで再取得するときは"写真へのアクセスを拒否したけど どうする?"的な感じです:

ほかにできること

今回は試していませんが、Camera と Notification など複数のパーミッションの組み合わせを取得したいときは いい感じにパーミッションを取得してくれるようです:

UI のカスタマイズもいろいろできるとのことです。

参考資料