Казалось бы, очень важно, чтобы приложение VoIP выполняло те же правила, что и приложение для настольных компьютеров, но оказалось, что практически невозможно реализовать звонок правильно. Несколько вещей, которые я пробовал:Как сделать приложение для iphone iOS подчиняться Не беспокоить при звонке?
Локальные push-уведомления с кольцевым звуком.
Хорошо: подчиняется режиму Silent и DND.
Плохое: Звук может быть не более 30 секунд, и он вибрирует только один раз, когда появляется уведомление. Поэтому для достижения эффекта звонка уведомление должно быть повторно нажато, например. каждые 6 секунд, эффективно рассылая центр уведомлений. Кроме того, push-уведомления не звучат и не вибрируют, если приложение активно, поэтому приложение должно обнаруживать это и звонить по-другому.
AudioServicesPlayAlertSound()
.Хорошо: надлежащий API, предназначенный специально для этой задачи. Слушает тихий режим.
Плохо: полностью игнорирует режим «Не беспокоить», звук и вибрация проходят прямо.
Используйте
AVFoundation
для воспроизведения звукового сигнала.Хорошо Звук играет.
Плохое: не поддерживает вибрацию, не поддерживает режим «тихий»/«Не беспокоить». По существу не используется в качестве звонка.
Есть ли лучший способ? Или Apple полностью пропустила этот прецедент?
Я принимаю ваш ответ, потому что именно так мы закончили его реализацию. Мы также позволяем уведомлению вибрировать, чтобы он даже не вибрировал в режиме «Не беспокоить». Хотелось бы, чтобы был лучший ответ. Это явно хак. – SnakE
Мы реализовали решение, описанное терадилом. Это отлично работает, когда приложение находится в фоновом режиме. Однако, если приложение находится на переднем плане, уведомление не будет вибрировать или воспроизводить звук. Поэтому мы фиксируем уведомление в приложении (приложение: UIApplication, didReceiveLocalNotification уведомление: UILocalNotification) и воспроизводить звук с помощью AudioServicesPlayAlertSound(). Это работает, однако, когда пользователь отвечает, звук будет продолжать воспроизводиться через динамик до тех пор, пока файл wav не будет завершен. Я не могу найти способ остановить это воспроизведение. – KeithB