2016-08-15 10 views
5

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

  • Для поддержки воспроизведения и записи (ввод и вывод), мне нужно использовать AVAudioSessionCategoryPlayAndRecord
  • Making телефон вибрирует через AudioServicesPlaySystemSound (kSystemSoundID_Vibrate) не поддерживается ни в одной из категорий записи, включая AVAudioSessionCategoryPlayAndRecord.
  • Включение других приложений для воспроизведения аудио может быть выполнено путем добавления опции AVAudioSessionCategoryOptionMixWithOthers.

Поэтому я делаю это в моем приложении делегат:

NSError *error = nil; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:&error]; 

возможных решений делает вибрацию, что я пытался, но не на это:

  • деактивация общий AVAudioSession перед вибрацией, а затем активировать его сразу после.

    [[AVAudioSession sharedInstance] setActive:NO error:nil];   
    AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); 
    [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
    

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

  • Изменение категории перед вибрацией, а затем ее изменение.

    [[AVAudioSession sharedInstance] setActive:NO error:nil]; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; 
    [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
    
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); 
    
    [[AVAudioSession sharedInstance] setActive:NO error:nil]; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:nil]; 
    [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
    

    Это решение возникает время от времени, но, похоже, не работает для меня. Никакой вибрации не происходит, даже если категории, похоже, установлены. Это все равно может быть правильным решением, если я установил usesApplicationAudioSession = YES на мой AVCaptureSession, но я еще не сделал его работу.

Источники:

+0

Есть ли 'AVAudioRecorder' экземпляр запись при попытке вибрировать? – spassas

ответ

1

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

UIImpactFeedbackGenerator

UISelectionFeedbackGenerator

UINotificationFeedbackGenerator

https://developer.apple.com/reference/uikit/uifeedbackgenerator#2555399

+0

Спасибо, но мне нужно также поддерживать старые устройства –

+0

. Благодаря! – atomkirk

+2

Я пробовал это решение, но похоже, что есть проблема, когда приложение записывает. FeedbackGenerators просто не работают – vaberer

1

Итак, я недавно пытался воспроизвести простой звуковой сигнал в своем приложении, и один из способов сделать это я наткнулся на:

AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID); 

Это функция, которая играет звук системы от /System/Library/Audio/UISounds/ она поддерживается на всех версиях IOS.

Звук 1350 равен RingerVibeChanged (вибрация). Так ...

AudioServicesPlaySystemSound(1350); 

... вибрирует около 0,5 секунд.

Incase вы заинтересованы в большем количестве звуков здесь есть ссылка на все воспроизводимые звуки и какие IOS версии они были добавлены в: http://iphonedevwiki.net/index.php/AudioServices

+0

Использование AudioServicesPlaySystemSound для выполнения вибрации - проблема, которую я испытываю. Использование 1350 вместо kSystemSoundID_Vibrate (которое является просто псевдонимом для 4095) не имеет значения. –