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
結果
無事権限要求画面が表示された!!!
何が起きたの?
わからん!!!また今度勉強しよう。