Есть ли способ продлить кольцо навсегда при входящем звонке в приложении VoIP?

Я работаю над VoIP-приложением IOS.

Существует два способа воспроизвести звук, чтобы уведомить пользователя, когда приходит вызов:

  1. Отправьте UILocalNotification со звуком. Звук будет длиться не более 30 секунд;
  2. Воспроизведение локального музыкального актива в setKeepAliveTimeout:handler: функция. Но система просто дает мне 10 секунд, чтобы выполнить операцию.

Есть ли способ воспроизвести звук навсегда, как родное приложение для телефона?

2 Solutions collect form web for “Есть ли способ продлить кольцо навсегда при входящем звонке в приложении VoIP?”

Боюсь, что @ Dan2552 прав.

Вот что говорит Apple:

Звуки, длившиеся более 30 секунд, не поддерживаются. Если вы укажете файл со звуком, который воспроизводится более 30 секунд, вместо него воспроизводится звук по умолчанию.


РЕДАКТИРОВАТЬ:

Воспроизведение аудиофайла более 30 секунд (или навсегда для этого) может быть достигнуто с помощью AVAudioPlayer от AVFoundation

 @import AVFoundation; // module -> no need to link the framework // #import <AVFoundation/AVFoundation.h> // old style - (void)playAudio { NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"]; NSError *error = nil; AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error]; if (!error) { player.numberOfLoops = -1; // infinite loop [player play]; } else { NSLog(@"Audio player init error: %@", error.localizedDescription); } } 

Затем вместо установки свойства soundName локального уведомления вы должны вызвать этот метод в основном потоке :

 [self performSelectorOnMainThread:@selector(playAudio) withObject:nil waitUntilDone:NO]; 

Проблема с ответом Ислама Q заключается в том, что AVAudioPlayer не будет работать для уведомления, поскольку приложение будет отключено, если вы не используете приложение. Только UILocalNotification может позволить вашему приложению воспроизводить звук, когда он неактивен. 30-секундный предел реальный. Это необходимо сделать, повторив уведомление с уведомлением за 30 секунд. Я не знаю, как долго другие приложения VOIP будут звонить, но даже с традиционным телефоном есть предел, как правило, что-то вроде минуты.

Моя стратегия:

  • Отправьте начальное уведомление с 29-секундным сигналом тревоги, с которым кто-то пытается связаться
  • Отправьте второе уведомление с другим 29-секундным сигналом тревоги через 40 секунд, что вы собираетесь пропустить звонок
  • Отправьте третье уведомление о том, что вы пропустили вызов через 100 секунд

Это позволит пользователю 1:40 времени ответить на вызов.

Ваш код будет выглядеть примерно так:

 UILocalNotification* notification = [[UILocalNotification alloc] init]; notification.alertBody = NSLocalizedString(@"FIRST_CALL", @"%@ is calling you!"); notification.soundName = @"normal_ring.mp3"; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(40 * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ if (!phone.isRinging) { // Somebody picked it up already in the mean time return; } UILocalNotification* notification = [[UILocalNotification alloc] init]; notification.alertBody = NSLocalizedString(@"HURRY_CALL", @"Hurry, you are about to miss a call from %@!"); notification.soundName = @"hurry_ring.mp3"; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ if (!phone.isRinging) { // Somebody picked it up already in the mean time return; } UILocalNotification* notification = [[UILocalNotification alloc] init]; notification.alertBody = NSLocalizedString(@"MISSED_CALL", @"You've just missed a call from %@"); notification.soundName = @"missed_call.mp3"; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; }); }); 

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

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

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

 UIBackgroundTaskIdentifier backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{ }]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [timerExecuted timerUpdate]; while (!timerExecuted.isStopped) { [NSThread sleepForTimeInterval:5]; } [application endBackgroundTask:backgroundTask]; }); 
  • Держите живое гнездо UDP в фоновом режиме для ios
  • Как показать в строке состояния вызова (двойная высота) для приложения Voip с зеленым цветом в iOS?
  • SIP-вызов получает статус «Сообщение о статусе по умолчанию» в iOS
  • Соединение сокета iOS9 было убито, когда приложение приостановлено, хотя приложение зарегистрировано как VOIP
  • Существуют ли специальные настройки звука, необходимые для работы Twilio VOIP на iOS?
  • Как удалить загруженные сертификаты APNS из панели инструментов Sinch App?
  • iOS 10: Как показать входящее уведомление о вызове VOIP, когда приложение находится в фоновом режиме?
  • Исходное изображение iOS не работает
  • Уведомление Voip Pushkit не будет перезапускать приложение, если оно было принудительно завершено, и устройство было перезагружено
  • iOS VoIP App - Приведение UIViewController к экрану при получении уведомления, когда приложение завершено
  • iOS - лучшая практика для отправки уведомлений о входящих звонках в VoIP-приложении
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.