Flutter: iOSのpermission_handlerで、許可していてもPermissionStatusがdeniedになる

スポンサーリンク

2022/5/6 Flutter エラー・バグ日記 

原因は単純だったが、かなりハマったので備忘。

 

ローカル通知のパッケージ「flutter_local_notifications」を使っているが、iOSでは、一度アプリからの通知を不許可にすると、再度、ユーザーに設定画面から許可するよう促す必要があるので、その許可状態を把握すべく「permission_handler」を導入した。

 

本記事はライトな日記思考で書いているので、詳細説明はしておらず、基本、テキストのみで画像とかは載せておりません。。m(_ _)m

解説記事ではないため、解決していない内容や、その時々の間違った解釈を述べてしまっている可能性が大いにありますので、何卒、ご了承ください。

 

しかし、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の学習で役立ったコンテンツ・書籍 /

 

 

 

 


Dart入門 – Dartの要点をつかむためのクイックツアー
タイトルとURLをコピーしました