2015-10-11 4 views
6

Так что дело в том, что мне нужно вызвать некоторую функцию после того, как пользователь предоставит (или отклонит) разрешение на использование микрофона.Как определить пользователя, предоставляющего разрешение на микрофон для iOS?

Я уже видел это:

[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { 
     if (granted) { 
      // Microphone enabled code 
      [self someFunction]; 

     } 
     else { 
      // Microphone disabled code 
     } 
}]; 

Однако, это работает только для обнаружения текущего состояния.

Если текущее состояние «нет», а всплывающее окно отображается, и пользователь дает разрешение - функция не будет вызываться. Это потому, что в момент выполнения этого разрешения было «нет», и пока мы не запустим код в следующий раз, функция не будет вызвана.

Что я хочу сделать, это вызвать функцию после нажатия пользователем «разрешить» или «уклониться».

Кто-нибудь знает, как это сделать?

EDIT: Забыл упомянуть, что это должно быть iOS 7.0-совместимое решение.

+1

Я не думаю, что вы можете обнаружить выбор автоматических разрешений записей, однако, вы можете создать таймер, который проверяет, если приложение имеет разрешения на каждый 1 второй или около того, и, если это произойдет, таймер останавливается, и приложение идет о своей цели, как и ожидалось. – vaid

+0

Это также верно – veich

ответ

11

Метод AVAudioSession представлен в iOS 8 есть записьPermission. Это возвращает перечисление с именем AVAudioSessionRecordPermission. Вы можете использовать переключатель, чтобы определить, было ли уведомление о разрешении предоставлено пользователю или нет. Таким образом вы вызываете только requestRecordPermission, когда он не был представлен пользователю, поэтому блок разрешений может предположить, что он выполняется после того, как пользователь разрешает или запрещает разрешение в первый раз.

Примером может быть что-то вроде -

AVAudioSessionRecordPermission permissionStatus = [[AVAudioSession sharedInstance] recordPermission]; 

switch (permissionStatus) { 
    case AVAudioSessionRecordPermissionUndetermined:{ 
      [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { 
      // CALL YOUR METHOD HERE - as this assumes being called only once from user interacting with permission alert! 
       if (granted) { 
        // Microphone enabled code 
       } 
       else { 
        // Microphone disabled code 
       } 
      }]; 
      break; 
      } 
    case AVAudioSessionRecordPermissionDenied: 
      // direct to settings... 
      break; 
    case AVAudioSessionRecordPermissionGranted: 
      // mic access ok... 
      break; 
    default: 
      // this should not happen.. maybe throw an exception. 
      break; 
} 
+0

Это похоже на хороший ответ, но я забыл упомянуть, что мне нужно iOS 7.0-совместимое решение. Я буду голосовать за решение. – veich

+1

Я вижу ... так как предупреждение о разрешении предоставляется пользователю только один раз, возможно, подумайте о том, чтобы написать какой-то флаг в NSUserDefaults после вызова запросаRecordPermission. Но проверяйте флаг перед вызовом, и если он отсутствует, вы узнаете, что его вызывают в первый раз, и поэтому вы можете сделать аналогичное предположение в блоке разрешений в качестве моего ответа. – Bamsworld

0

Если использовать еще не дал свое разрешение, выполните следующие действия:

  1. Во-первых, показать всплывающее окно диалога
  2. запустить свой код в OP

-

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)]) { 
    [[AVAudioSession sharedInstance] requestRecordPermission]; 
    // Now run your function 
} 
+1

Я думаю, что OP означает, что он хочет захватить запрос автоматической записи, который iOS появляется для вас, когда вы пытаетесь получить доступ к микрофону. – vaid

+0

Я не знаю, что такое OP и где должен выполняться этот код. Пытался добавить его, и код сразу же запускается, поэтому нет возможности зафиксировать ответ пользователя – veich

+1

OP означает «оригинальный плакат». Код может быть вставлен внутри метода. Когда метод вызывается, этот код выполняется. – vaid