Как воспроизвести уведомление за кадром при потере сигнала (т. Е. При отсутствии взаимодействия с пользователем)?

Я создал простое приложение для потоковой передачи звука, которое выглядит так:

введите здесь описание изображения

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

введите здесь описание изображения

Я хочу сделать приложение доступным для слепых или слабовидящих людей, поэтому я хочу, чтобы закадровый голос говорил «Сигнал потерян» и «Повторное подключение», когда сигнал теряется и появляется этот оверлейный экран. Все это происходит БЕЗ КАКИХ-ЛИБО ВЗАИМОДЕЙСТВИЙ ПОЛЬЗОВАТЕЛЯ (аналогично тому, что происходит, когда экран выходит из строя, и голосовой голос говорит: «Экран затемнен»). Было бы неплохо, если бы голосовой голос сказал: «Сигнал восстановлен» при повторном подключении тоже, но это не обязательно.

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

Как мне этого добиться?

Заранее спасибо за вашу помощь!


person Manelion    schedule 26.02.2018    source источник


Ответы (3)


Вы можете использовать UIAccessibilityPostNotification, чтобы сделать «объявление», которое заставит его прочитать его вслух (только когда включен VoiceOver):

UIAccessibilityPostNotification(
    UIAccessibilityAnnouncementNotification, 
    "Signal Lost" as NSString
)

В документации для UIAccessibilityAnnouncementNotification объясняется аргумент NSString и когда его можно использовать. :

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

Используйте это уведомление, чтобы предоставить информацию о специальных возможностях о событиях, которые не обновляют пользовательский интерфейс приложения (UI) или обновляют пользовательский интерфейс только на короткое время.

Я бы порекомендовал использовать объявления экономно, но я бы сказал, что события, которые происходят без какого-либо взаимодействия с пользователем, часто - но не всегда - являются хорошим их использованием.

person David Rönnqvist    schedule 27.02.2018
comment
Прекрасно работает. Спасибо! - person Manelion; 28.02.2018

Ну, вы можете создать mp3-запись голоса, а затем просто использовать AVAudio, чтобы воспроизвести ее, когда появится экран.

person Will Boland    schedule 26.02.2018

Если вы настроены на воспроизведение аудио, но у вас нет MP3, вы можете использовать AVFoundation:

import AVFoundation

Создайте функцию, которая синтезирует предупреждение и т. Д., Например.

/// Reads A Word Using Speech Syntheseis
///
/// - Parameters:
///   - word: String
func readWordAloud(_ word: String){

    //1. Create The Word To Be Read Aloud
    let wordReader = AVSpeechUtterance(string: word)
    wordReader.volume = 1

    //2. Pass It To The Speech Synthesizer
    let speechSynthesizer = AVSpeechSynthesizer()
    speechSynthesizer.speak(wordReader)

}

Вызовите метод так:

readWordAloud("No Audio Available")

А чтобы отключить взаимодействие с UIView, просто используйте:

self.view.isUserInteractionEnabled = false
person BlackMirrorz    schedule 27.02.2018
comment
Спасибо! Это будет читать текст все время. Хотелось бы, чтобы текст озвучивался только при включенном закадровом озвучивании. Аналогичные события, не инициированные пользователем, действительно происходят, например, когда время ожидания экрана истекает и голосовой абонент говорит, экран затемнен. Для этого должен быть какой-то механизм. - person Manelion; 27.02.2018