僕が作ったグラフ作成アプリ「Grapho」では
作成したグラフを画像にしてiPhoneの写真アプリ(アルバム)に保存できるんですが、
ユーザー様より
「グラフを保存しようとしてもiPhoneの写真アプリに保存できない」
というご意見を頂きました。
頂いた情報を元に調査したのですが、確認する限りグラフ画像の保存処理は正常に行われていました。
そして、もしかしたらと思い
「iPhoneの設定アプリでGraphoアプリに写真アプリへのアクセス許可がされているか確認してみてください」
と伝えたところ、無事グラフ画像の保存ができるようになったとのこと。
iPhoneにアプリをインストールすると、初期段階でPush通知などのアクセス許可を求めるダイアログが表示されますが、許可せずに飛ばしてしまう人も多いのかも知れません。
(アクセス許可を求めるダイアログ)
iPhoneの設定アプリで写真アプリへのアクセスが許可されているか確認する方法
iPhoneの設定アプリで写真アプリへのアクセス許可が行われているか確認する方法は以下です。(GraPhoの場合)
1.まずアクセス許可を確認したいアプリを選択する
2. 次に、写真アプリの項目が「読み出しと書き込み」になっているかチェックする
ここが「読み出しと書き込み」になっていれば、アプリからiPhoneの写真アプリの写真を読み出すこともできるし、画像を写真アプリに保存することができます。
アプリからユーザーのアクセス許可をチェックする方法
「PHPhotoLibrary.authorizationStatus()」を使えば、アプリからユーザーの写真アプリへのアクセス許可状態をチェックすることができます。
authorizationStatus() - PHPhotoLibrary | Apple Developer Documentation
アプリ起動時に、ユーザーのアクセス許可状態をチェックして、未許可の場合やアクセス不可設定にしている場合、ユーザーにアクセス許可設定の変更を促すダイアログを表示するといったことができるかと思います。
以下Swiftコードです。
====================================================
let status = PHPhotoLibrary.authorizationStatus()
if status == PHAuthorizationStatus.notDetermined {
//まだユーザーにアクセス許可を確認していない
PHPhotoLibrary.requestAuthorization { (status) in}
} else if status == PHAuthorizationStatus.restricted {
// ユーザー自身にカメラへのアクセスが許可されていない
// アプリで設定アプリへ誘導するダイアログを出すなど
} else if status == PHAuthorizationStatus.denied {
// ユーザーがアクセスを不可にしている
// アクセス許可しないと画像の保存が行えないことを伝えるダイアログを出す等
} else if status == PHAuthorizationStatus.authorized {
// アクセス許可されている
// 問題なし
}
====================================================
上記では、「PHAuthorizationStatus」が「notDetermined」(未許可)のステータスの場合、「requestAuthorization 」でアクセス許可を求めるダイアログを表示してます。
requestAuthorization: - PHPhotoLibrary | Apple Developer Documentation
PHAuthorizationStatusが「denied」の場合
「PHAuthorizationStatus」が「denied」(アクセス拒否)の場合は既にユーザーがアクセス許可の選択をしているので「requestAuthorization 」が使えません。
その場合は、「UIApplicationOpenSettingsURLString」で設定アプリへ遷移させるといった対処が必要かと思います。
==================================
if let url = URL(string: UIApplicationOpenSettingsURLString) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}
==================================