0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

問題のコード

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

   <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

<dict>
	<key>NSMicrophoneUsageDescription</key>
	<string>このアプリでは、録音機能を使用するためにマイクへのアクセスが必要です。</string>

だが上のrequestPermissionsを呼ぶと、Androidでは権限要求のポップアップが出るのに、iOSではポップアップが出ない。。。

GPT-4さんに聞くと

GPT-4「関連するCocoaPodsが不足しているかも!」

は?CocoaPodsて?

調べるとiOSやmacOSで使われるオープンソースの依存関係管理ツールらしいです。
flutterのプラグインがiOSプラットフォームの特定の機能にアクセスできるようにするとか。(よくわからなかったので詳しい人教えてくdし)
とりあえず言われるがままにflutterプロジェクトのiOSディレクトリに行きコードをターミナルで打つ。

sudo gem install cocoapods
pod install
pod update

なぜRubyのライブラリ管理ツールであるgemを使ってインストールするのかというと、CocoaPodsがRubyで書かれているかららしい。ここでRubyが出てくるとは面白い。

結果

ダメじゃねーか!

GPT-4が頼りにならないので、結局ググることに。

Webサイト(すみません出典忘れました)「以下のコードをiOS/Podfileに追加してみて!」

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

結果

無事権限要求画面が表示された!!!

何が起きたの?

わからん!!!また今度勉強しよう。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?