2014-10-22 6 views
0

У меня есть приложение, работающее на фоновом опросе сервера электронной почты и отправка локального уведомления при изменении. Я могу начать воспроизведение предупреждения из состояния фона, но если телефон вибрирует, звук не воспроизводится. Есть ли способ переопределить это, как звучит сигнал будильника часов, когда вибрирует?Воспроизведение звукового сигнала, когда телефон вибрирует

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

+ (void)initializeAudioSettings 
{ 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 

    NSError *setCategoryError = nil; 
    BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; 
    if (!success) { 
     NSLog(@"Error setting up Audio session: %@", setCategoryError.description); 
    } 

    NSError *activationError = nil; 
    success = [audioSession setActive:YES error:&activationError]; 
    if (!success) { 
     NSLog(@"Error setting audio session active: %@", activationError.description); 
    } 

} 

Следующих загружаю предупреждение:

- (void)loadAlertSoundID 
{ 
    NSLog(@"Loading alert sound"); 
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"alert" ofType:@"mp3"]; 
    NSURL *soundURL = [NSURL URLWithString:soundPath]; 

    CFURLRef url = (__bridge CFURLRef)soundURL; 

    AudioServicesCreateSystemSoundID(url, &_alertSoundID); 
} 

Тогда, когда я «м уведомление о новом сообщении, я называю мой бдительный метод:

- (void)playAlert 
{ 
    NSLog(@"Playing alert"); 
    AudioServicesPlaySystemSound(_alertSoundID); 

    _alertShouldBePlaying = YES; 
    _alertIsPlaying = YES; 

    AudioServicesAddSystemSoundCompletion(_alertSoundID, nil, nil, playSoundFinished, (__bridge void*)self); 

    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(vibrate:) userInfo:nil repeats:YES]; 
} 

И для завершения, мои завершающие бло ck .:

void playSoundFinished (SystemSoundID sound, void *data) 
{ 
    Alert *alert = [Alert sharedAlert]; 
    if (sound == alert.alertSoundID) 
    { 
     alert.alertIsPlaying = NO; 

     // Repeat until alert is disabled 
     if (alert.alertShouldBePlaying && !alert.alertIsPlaying) 
     { 
      [alert playAlert]; 
     } 
    } 

} 
+2

Это функция «Получите меня от театра»? –

+0

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

+1

Весь смысл ставить телефон на вибрацию - это не звучит. – rmaddy

ответ

0

Есть способ сделать это, но если бы я был пользователем вашего приложения, я бы не оценил это.

Посмотрите на AVAudioSessionCategory. Вы можете установить свою AVAudioSession.category в AVAudioSessionCategoryPlayback или AVAudioSessionCategoryPlayAndRecord, и это обойдется беззвучным переключателем на телефоне, а также с любыми настройками звукового сигнала. Тем не менее, он может регулироваться кнопками регулировки громкости.

EDIT: Вы также хотите использовать AVAudioPlayer или AudioUnit для воспроизведения звука в отличие от AudioServicesPlaySystemSound, чтобы обойти беззвучный режим.

+0

У меня уже было настроено воспроизведение, и я просто попробовал playAndRecord, но он все еще бесшумный, когда он приходит в – Chris

+0

Правильно, я должен был прочитать ваше сообщение. Вы воспроизводите свой звук с помощью метода AudioServicesPlaySystemSound. Если вы используете AVAudioPlayer или API AudioUnit более низкого уровня, вы можете обойти бесшумный режим. Я не считаю, что AudioServicesPlaySystemSound уважает вашу AVAudioSessionCategory. – quark

+0

Хорошо, спасибо за понимание. Я собираюсь посмотреть в AudioUnit и посмотреть, что я могу сделать с этим – Chris

Смежные вопросы