在 ios 上使用 flutter 请求用户权限 - flutter

问题描述 投票:0回答:3

我的应用程序允许用户使用相机或图库更改其个人资料图片,图片会上传到 Firebase 存储,然后图像链接会在用户的 Firestore 信息中更新,

在 Android 设备中,会出现请求许可的对话框并且其工作正常,但在 ios 中没有显示对话框,相机或图库根本无法打开,代码如下:

uploadImageCamera() async {
    final _firebaseStorage = FirebaseStorage.instance;
    final _userStorage =
        FirebaseFirestore.instance.collection("Users").doc(user!.uid);
    final _imagePicker = ImagePicker();
    PickedFile? image;
    //Check Permissions
    await Permission.camera.request();

    var permissionStatus = await Permission.camera.status;

    if (permissionStatus.isGranted) {
      //Select Image
      image = await _imagePicker.getImage(source: ImageSource.camera);
      var file = File(image!.path);

      if (image != null) {
        //Upload to Firebase
        var snapshot = await _firebaseStorage
            .ref()
            .child('users_images/${loggedInUser.name}.jpg')
            .putFile(file);
        var downloadUrl = await snapshot.ref.getDownloadURL();
        setState(() {
          imageUrl = downloadUrl;
          loggedInUser.profileImage = imageUrl;
          _userStorage.update({'profileImage': imageUrl});
        });
      } else {
        print('No Image Path Received');
      }
    } else {
      print("Nothing....!");
    }
  }

我已将相机和图库权限添加到 info.plist 文件中:

<key>NSPhotoLibraryUsageDescription</key>
<string>App needs access to photo lib for profile images</string>

<key>NSCameraUsageDescription</key>
<string>To capture profile photo please grant camera access</string>

现在,当我在 iOS 设备上测试时,对话框不会打开以要求访问权限,所以我不确定我缺少什么,我将不胜感激。谢谢

flutter dart
3个回答
1
投票

在 Podfile.lock 中

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end
end

替换为以下

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.calendar
               ##'PERMISSION_EVENTS=1',

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

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

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

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

               ## dart: PermissionGroup.speech
               #'PERMISSION_SPEECH_RECOGNIZER=0'

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

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

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

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

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

               ## dart: PermissionGroup.sensors
               #'PERMISSION_SENSORS=0'
             ]
    end
  end
end

我的权限功能

Future<bool?> _checkPermission(BuildContext context) async {
  Map<Permission, PermissionStatus> statues = await [Permission.camera, Permission.storage, Permission.photos].request();
  PermissionStatus? statusCamera = statues[Permission.camera];
  PermissionStatus? statusStorage = statues[Permission.storage];
  PermissionStatus? statusPhotos = statues[Permission.photos];
  bool isGranted = statusCamera == PermissionStatus.granted && statusStorage == PermissionStatus.granted && statusPhotos == PermissionStatus.granted;
  if (isGranted) {
    return true;
  }
  bool isPermanentlyDenied = statusCamera == PermissionStatus.permanentlyDenied || statusStorage == PermissionStatus.permanentlyDenied || statusPhotos == PermissionStatus.permanentlyDenied;
  if (isPermanentlyDenied) {
    return false;
  }
  return null;
}

及使用方法

  bool? isCheck = await _checkPermission(context);
            if (isCheck == true) {
              await getImage(ImageSource.gallery);
            } else {
              errorDialog(context, "image_screen.check_permission_app".tr()).whenComplete(() => openAppSettings());
            }

0
投票

您可以使用像permissionHandler这样的flutter包来让您更轻松地处理flutter中的权限。

示例:

var status = await Permission.camera.status;
if (status.isDenied) {
  // We didn't ask for permission yet or the permission has been denied before but not permanently.
}

// You can can also directly ask the permission about its status.
if (await Permission.location.isRestricted) {
  // The OS restricts access, for example because of parental controls.
}

如果你在 void 或其他函数中编写代码,不要忘记添加 async

permissionChecker() async {
//your code here
}

0
投票

如果您想添加联系人,请按照文档进行操作,但一定要添加

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

在 IOS 的 POD 文件中

config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
  '$(inherited)',
    ## dart: PermissionGroup.photos
  'PERMISSION_PHOTOS=1',
    ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
  'PERMISSION_LOCATION=1',
    ## dart: PermissionGroup.notification
  'PERMISSION_NOTIFICATIONS=1',
    ## dart: PermissionGroup.contacts
  'PERMISSION_CONTACTS=1',
    ## dart: PermissionGroup.mediaLibrary
      # 'PERMISSION_MEDIA_LIBRARY=1',
]
© www.soinside.com 2019 - 2024. All rights reserved.