Flutter: iOSのpermission_handlerで、許可していてもPermissionStatusがdeniedになる
結論:info.plistとPodfileに設定を追記後、pod installをし直す
2022/5/6 Flutter エラー・バグ日記
原因は単純だったが、かなりハマったので備忘。
ローカル通知のパッケージ「flutter_local_notifications」を使っているが、iOSでは、一度アプリからの通知を不許可にすると、再度、ユーザーに設定画面から許可するよう促す必要があるので、その許可状態を把握すべく「permission_handler」を導入した。
しかし、pod installしてからビルドしたところ、許可状態にしているにもかかわらず、「PermissionStatus」(許可状態を把握するプロパティ)が、常に「denied」で返ってきてしまう。。。
該当箇所のコードは以下。
if (Platform.isIOS) { // permission_handler で通知に対する許可状態を把握 var statusForNotificationO = await Permission.notification.status; print("statusForNotificationO: $statusForNotificationO"); if (statusForNotificationO != PermissionStatus.granted) { // 許可されていなかったら、ここで設定変更してもらうよう、促すメッセージを出す } }
この「statusForNotificationO」が常に「PermissionStatus.denied」になってしまう。
これだと、不許可か否かの判定に使えない。。
改めて「permission_handler」のReadmeを読むと、「info.plist」に加え、「Podfile」に設定変更が必要だったので、下記のとおり再設定した(以前、別のプロジェクトで、「Podfile」の設定をしなくても動作したので、対応を省略していた)。
「info.plist」に追記した設定
<key>PermissionGroupNotification</key> <string>ローカル通知をするため</string> <!-- ↑flutter_local_notificationsの設定で許可ダイアログを出すので、実際はこの文章は使われない模様 -->
「Podfile」に追記した設定
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) ## 追記箇所 ここから target.build_configurations.each do |config| config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ '$(inherited)', ## dart: PermissionGroup.notification 'PERMISSION_NOTIFICATIONS=1', ] end ## 追記箇所 ここまで end end
しかし、これらの設定後に再ビルドしても、依然として「denied」しか返ってこない。。
通知許可確認のダイアログは、「flutter_local_notifications」導入時に設定したコードにより、アプリの初回起動時に発動される。
そのため、「permission_handler」からも発動する必要があるのか?と思い、
Permission.notification.request();
も追加してみたが、やはり変わらず。。というか、許可確認ダイアログ自体が出ない。
ググってみると、こちらのイシューが自分の状況と似ていた。
しかし、このイシューの結論は、パッケージのReadmeのiOS設定セクションにある「info.plist」と「Podfile」の設定をきちんとやることであり、この点は対応済だったので、解決に至らず。。
ここで改めてReadmeのiOS設定セクションをよく見ると、4番目の工程として、
4. Clean & Rebuild
という項目があることに気づく。
もしや、、、と思い、
flutter clean → pub get → pod install
をしてから再ビルドすると、無事、許可状態で「PermissionStatus.granted」が返ってきた。
「info.plist」と「Podfile」の設定を変更した場合は、再度、pod installが必要だった模様。
「4. Clean & Rebuild」の記述が小さめだったので、完全に見落としていた。。隅々までよく確認することが大事。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/