разрешения камеры iOS не отображаются в настройках некоторых устройств

У меня возникли некоторые проблемы с использованием камеры. Проблема в том, что некоторые устройства показывают мне запись камеры в настройках, а некоторые-нет. В тех устройствах, где переключатель камеры не отображается, я не могу использовать камеру, поскольку у нее нет разрешений, а также она не отображается в настройках для их включения.

вот как это выглядит на устройстве, которое работает:

enter image description here

и вот как это выглядит в устройствах это не работает.

enter image description here

когда я сделал эти скриншоты, приложение должно было уже запросить разрешения, но этого не произошло.

Я также проверил, что эти устройства не имеют ограничений.

какие идеи?

обновление 1: добавлен код

Это код, который я использую для отображения камеры (он находится под пользовательским видом, а не родным видом камеры контроллер)

self.captureSession = [[AVCaptureSession alloc] init];
AVCaptureDevice *videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoCaptureDevice error:&error];
if(videoInput)
{
    [self.captureSession addInput:videoInput];
}
else
{
    NSLog(@"Error: %@", error);
}

AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
[self.captureSession addOutput:metadataOutput];
[metadataOutput setMetadataObjectsDelegate:self
                                     queue:dispatch_get_main_queue()];
[metadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeQRCode]];

AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
previewLayer.frame = self.view.layer.bounds;
UIView * previewView = [[UIView alloc] initWithFrame:self.view.frame];
[previewView.layer addSublayer:previewLayer];
[self.view addSubview:previewView];
[self.view sendSubviewToBack:previewView];

[self.captureSession startRunning];

2 ответов


перед открытием сеанса необходимо запросить разрешение. Использовать

[AVCaptureDevice requestAccessForMediaType:completionHandler:]

Шаг 1: Дайте правильное сообщение доступа к сообщению камеры на вашей информации.plist используя следующий ключ (без кавычек)

"Privacy - Camera Usage Description"

Шаг 2: для objective-C / SWIFT вам нужно запросить разрешение доступа к камере

С

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
        {
            if (granted == true)
            {
                //[self presentViewController           : picker animated:YES completion:NULL];
               //Do your stuff

            }
            else
            {
                UIAlertView *cameraAlert = [[UIAlertView alloc]initWithTitle:STR_APPLICATION_TITLE
                                                                     message:STR_ALERT_CAMERA_DENIED_MESSAGE
                                                                    delegate:self
                                                           cancelButtonTitle:@"OK"
                                                           otherButtonTitles:nil,nil];
                [cameraAlert show];

                NSLog(@"denied");
            }

        }];

Свифт

AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (videoGranted: Bool) -> Void in
        if (videoGranted) {
             //Do Your stuff here

        } else {
            // Rejected Camera
        }
    })