iOSのカメラやアルバムへのアクセス許可などを一元管理するラッパークラス

こんばんは、daihaseです。

今夜もSwiftネタを書いてみます。
iOSアプリでカメラにアクセスしたりアルバムから写真を引っ張ってきたりする際には、カメラへのアクセス許可周りなど考慮しないといけない点がいくつかあります。

iOS7以前はカメラの使用に関しては一切の制限がありませんでした。
つまりアプリを作る側は好きにカメラアクセスのための処理を書き、それを呼び出せる状態だったのですが、iOS8以降は端末設定でその辺の機能を制御、つまりプライバシー設定的なことが可能となりました。

そのためカメラやアルバムアクセス周りを実装する開発者としては、その辺りを考慮しないとユーザーがアクセス制限をかけていたため、カメラを呼び出しても画面が真っ暗、といったことが起こってしまいます。

アクセス許可のステータスとしては以下の4つがあります。

  • authorized :許可済み(カメラや写真が利用出来る)
  • restricted :利用制限(設定 -> 一般 -> 機能制限 で利用が制限されている
  • denied :明示的拒否(設定 -> プライバシー で利用が制限されている)
  • notDetermined :許可も拒否もしていない状態

こうしたステータスをカメラ・写真へアクセスする箇所から毎回確認する処理を記述するのもあれなので、これらのステータス(状態チェック)をPhotoAuthorization.swift内にまとめ、カメラ・写真アクセスのためのメソッドをまとめたクラスをPhotoRequestManager.swiftとしました。

基本的にこの2つのクラスをプロジェクト内に入れておくだけで、あとはカメラや写真にアクセスしたいViewController等で決まった呼び出し方をしてやるだけで使い回せるようになります。

簡単なサンプルを書いて見ましたので参考にしてみてください。

説明を簡単にするためにStoryboard等は使わずコードのみで今回は作ります。
カメラとフォトライブラリーを起動するためのボタンを画面にセットし、それぞれタップすると上記で説明したユーザーの端末上のアクセス許可周りをチェックした上での結果を返すメソッドを記述しています。

どちらも基本的にアクセスが許可されていて成功すると選択、または撮影した画像が返ってきて、それが画面へ表示されるようなプロジェクトとなっています。

次にカメラや写真へアクセスするためのメソッドをまとめたPhotoRequestManager.swiftをみてみます。

呼び出し元(ここではViewController)から渡ってきた取得したい写真の取得先を元に処理を分けている感じです。取得先はフォトライブラリ(PhotoLibrary)カメラ(Camera)フォトアルバム(SavedPhotosAlbum)の3種類となります。この3種類の呼び出しタイプによってアクセス許可を見に行き、その結果に応じて処理を再び呼び出し元へ返します。

fileprivate var completionHandler: (PhotoResquestCompletion)? 、これに呼び出し元から渡ってきたクロージャーが格納され、アクセス許可の結果を引数にセットし再び呼び出し元へ返す、というような流れになっています。

UIImagePickerControllerDelegateをこのクラス内にもたせているので、ここで成功時の取得した画像や失敗時の結果を呼び出し元へ返していますね。

では最後に、アクセス許可を管理するPhotoAuthorization.swiftを見てみます。

カメラ・写真とそれぞれアクセスしてきた際に、ユーザーが設定したアクセス許可設定を見て、その結果に応じて処理を返しています。先ほどのPhotoRequestManagerが今度は呼び出し元になる感じですね。PhotoAuthorizedCompletion型のresultBlockというクロージャーが渡ってくるので、それにアクセス許可設定の結果を引数にセットし再び呼び出し元へ、という流れです。

これで一旦準備は完了ですが、大事な部分が一点。カメラやフォトライブラリーへアクセスするプロジェクトはInfo.plistへ以下のような記述をしないといけないのでお忘れなく。

これらを追加したら、実行してみましょう。

フォトライブラリー起動ボタンを押すと、

ちゃんとアクセス許可のメッセージも出て、

ピッカーも出現しますね。写真を選択すると、

このように画面中央に選択した画像がセットされます。

もちろん「設定」で写真へのアクセスを拒否してもちゃんと機能するので試してみましょう。

こちら、シミュレーターで該当のPhotoRequestManagerプロジェクトの写真へのアクセスを拒否している部分です。

実際このように拒否をつけた状態で、「フォトライブラリー起動」ボタンを押してみると以下のような結果が返ってくるかと思います。

ここではアクセス許可で .faild が返ってきたらprint(“failed”)とするようにしているため、このような結果となりますが、実際のサービスの場合はポップアップなどで警告を出してアクセス許可設定を変更してください等促すのが良さそうですね。

こちらGitHubにプロジェクトのサンプルを上げておきます。

PhotoRequestManager.swift」「PhotoAuthorization.swift」2ファイルをそのまま自プロジェクトに持って行って使っもらえれば、簡単に全アクセス許可周りを一元管理出来るようになるのでよかったら是非〜

ではでは良い開発ライフを〜

スポンサーリンク
336 x 280 レクタングル(大)
336 x 280 レクタングル(大)