Flutterのpermission_handlerがiOSで要求画面を表示しない問題の解決

flutter使ってますか？
クロスプラットフォームとかホットリロードとかライブラリの充実とか、AndroidStudioで開発していた時よりも気持ちよくて好きです。
今回は、flutterの権限要求ライブラリpermission_handlerを使った時に、
Android側では権限要求ポップアップが出たのにiOSでは出なかった問題を、iOS素人がGPT-4さんにいろいろ聞いて解決したメモです。

問題のコード
```dart
import "package:permission_handler/permission_handler.dart";

class PermissionHandler {
  final Map<String, Permission> _permissions = {
    "microphone": Permission.microphone,
    "storage": Permission.storage,
  };

  Future<bool> requestPermissions(List<String> keys) async {
    // Request permissions for each key
    Map<Permission, PermissionStatus> statuses = await [
      for (final key in keys) _permissions[key]!,
    ].request();

    // Check if all permissions are granted
    bool allGranted = statuses.values.every((status) => status.isGranted);

    return allGranted;
  }
}
```
Android側のパーミッション設定
AndroidManifest.xml
```xml
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```
iOS側のパーミッション設定
Info.plist
```plist
<dict>
	<key>NSMicrophoneUsageDescription</key>
	<string>このアプリでは、録音機能を使用するためにマイクへのアクセスが必要です。</string>
```
だが上のrequestPermissionsを呼ぶと、Androidでは権限要求のポップアップが出るのに、iOSではポップアップが出ない。。。

### GPT-4さんに聞くと
GPT-4「関連するCocoaPodsが不足しているかも！」

### は？CocoaPodsて？
調べるとiOSやmacOSで使われるオープンソースの依存関係管理ツールらしいです。
flutterのプラグインがiOSプラットフォームの特定の機能にアクセスできるようにするとか。（よくわからなかったので詳しい人教えてくdし）
とりあえず言われるがままにflutterプロジェクトのiOSディレクトリに行きコードをターミナルで打つ。
```bash
sudo gem install cocoapods
pod install
pod update
```
なぜRubyのライブラリ管理ツールであるgemを使ってインストールするのかというと、CocoaPodsがRubyで書かれているかららしい。ここでRubyが出てくるとは面白い。

### 結果
ダメじゃねーか！

### GPT-4が頼りにならないので、結局ググることに。
Webサイト（すみません出典忘れました）「以下のコードをiOS/Podfileに追加してみて！」
```ruby
post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    target.build_configurations.each do |config|
      # You can remove unused permissions here
      # for more information: https://github.com/BaseflowIT/flutter-permission-handler/blob/master/permission_handler/ios/Classes/PermissionHandlerEnums.h
      # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0'
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',

        ## dart: PermissionGroup.calendar
        # 'PERMISSION_EVENTS=1',

        ## dart: PermissionGroup.reminders
        # 'PERMISSION_REMINDERS=1',

        ## dart: PermissionGroup.contacts
        # 'PERMISSION_CONTACTS=1',

        ## dart: PermissionGroup.camera
        # 'PERMISSION_CAMERA=1',

        ## dart: PermissionGroup.microphone
        'PERMISSION_MICROPHONE=1',

        ## dart: PermissionGroup.speech
        # 'PERMISSION_SPEECH_RECOGNIZER=1',

        ## dart: PermissionGroup.photos
        # 'PERMISSION_PHOTOS=1',

        ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
        # 'PERMISSION_LOCATION=1',

        ## dart: PermissionGroup.notification
        # 'PERMISSION_NOTIFICATIONS=1',

        ## dart: PermissionGroup.mediaLibrary
        # 'PERMISSION_MEDIA_LIBRARY=1',

        ## dart: PermissionGroup.sensors
        # 'PERMISSION_SENSORS=1',

        ## dart: PermissionGroup.bluetooth
        # 'PERMISSION_BLUETOOTH=1',

        ## dart: PermissionGroup.appTrackingTransparency
        # 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',

        ## dart: PermissionGroup.criticalAlerts
        # 'PERMISSION_CRITICAL_ALERTS=1',
      ]

    end
  end
end
```

### 結果
無事権限要求画面が表示された！！！

### 何が起きたの？
わからん！！！また今度勉強しよう。