Как показать зеленую строку состояния двойной высоты (In-Call) в приложении переднего плана на устройстве?

Здесь много вопросов, касающихся отображения красной полосы записи в фоновом режиме. Совершенно ясно, что я должен использовать для этого AVAudioSession категорию AVAudioSessionCategoryPlayAndRecord. Мой вопрос: как я могу отобразить зеленую полосу входящих вызовов (или, по крайней мере, красную полосу) в приложении переднего плана, когда в моем приложении есть активный вызов VOIP? Так что я мог вернуться к вызову пользовательского интерфейса, коснувшись области строки состояния, точно так же, как Whatsapp или Skype.

Что я уже пробовал:

  • voip и audio в ключе UIBackgroundModes в Info.plist + setCategory:AVAudioSessionCategoryPlayAndRecord + setActive, как предлагается в этом SO-ответе (дает мне красный строка состояния при переходе в фоновый режим, но ничего на переднем плане)
  • Предыдущий + AVAudioSession + setMode:AVAudioSessionModeVoiceChat - не сработало
  • Установить флаг kCFStreamNetworkServiceTypeVoIP для сокета в исходниках pjsip и перекомпилировать его - не помогло. Кроме того, не рекомендуется, начиная с iOS 8.
  • Создал отдельный сокет, установил флаг voip для inputStream / outputStream: [self.inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] (взял пример кода из здесь )

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


Изменить. Поскольку стандартного способа сделать это не удалось, принят ответ @ roman-ermolov. Тем, кто будет искать ответ, могу предложить несколько вариантов, чтобы сделать это самостоятельно:

  1. Оберните корневой контроллер представления внутри контейнера, как в Пример iAdSuite от Apple с раскадровкой. Взгляните, например, на мой образец проекта. Наверное, лучший способ сделать этот бар.
  2. Взломать высоту UINavigationBar (см. этот подход) - не работа для пейзажа еще, но, возможно, будет решена
  3. Управляйте своим основным фреймом UIWindow самостоятельно, поместите еще один UIWindow под строку состояния с желаемым содержимым.

person Sega-Zero    schedule 03.08.2016    source источник
comment
Был ли мой ответ полезным или, может быть, вы ищете детали реализации? Если да, не могли бы вы предоставить дополнительную информацию о ваших требованиях?   -  person Roman Ermolov    schedule 10.08.2016
comment
Это было очень полезно, спасибо. Я все еще надеюсь, что есть системный способ включить запрет вызова, если таковой имеется. Если никто не найдет, я приму твой ответ   -  person Sega-Zero    schedule 10.08.2016
comment
Не могли бы вы дать мне ответ в моем приложении для Android?   -  person user_1989    schedule 19.10.2018
comment
Я не разработчик Android, но я считаю, что вы можете добиться того же с помощью той же техники - встроить весь свой пользовательский интерфейс в контейнер и при необходимости уменьшить его размер.   -  person Sega-Zero    schedule 20.10.2018
comment
Ваш примерный проект - лучшее решение, с которым я когда-либо сталкивался. Я проверил ваш образец проекта, он работает, но у него мало проблем с устройствами iPhone X +. Нажатие на панель вызова не работает. Не могли бы вы обновить свой образец проекта?   -  person Raymond    schedule 13.05.2020
comment
Надеюсь получить время, чтобы обновить код. AFAIR, я добавил safeAreaInsets.top в высоту панели вызова   -  person Sega-Zero    schedule 13.05.2020
comment
Итак, я создал настраиваемый вид панели вызовов, который показывает нормально ... но как нам вернуться к исходному экрану набора вызовов при нажатии на панель вызова?   -  person Bruce    schedule 19.10.2020
comment
Вы не можете сделать это на переднем плане   -  person Sega-Zero    schedule 20.10.2020


Ответы (2)


Я изучил оба приложения (WhatsApp и Skype) и узнал, что они использовали свой собственный UIView для достижения этой функциональности.

Это Skype:  Строка состояния Skype

Это WhatsApp (Reveal не может получить настоящий снимок, но он передает основную идею): введите описание изображения здесь

В обоих приложениях это UIView, который запускается в верхней части экрана, и несколько методов для форматирования вывода текста / касания к нему.

В iOS 10 Apple представила CallKit.framework, но похоже, что это не так. такой функционал тоже, поэтому единственный способ сделать это - сделать самому.

person Roman Ermolov    schedule 06.08.2016
comment
Как вы смогли увидеть иерархию приложений Skype и WhatsApp, если вы не являетесь их разработчиком и оно не открывается? - person swift2geek; 27.07.2020
comment
Ермолов это все еще работает в ios 11? Я попытался подключиться к процессу и, похоже, IM не смог этого сделать. Я думаю, у вас нет исходного кода WhatsApp или Skype, чтобы запустить его в xcode, я прав? - person swift2geek; 27.07.2020
comment
Вы знаете, какой код вернуть пользователю в пользовательский интерфейс вызова при нажатии на верхнюю панель? - person Bruce; 19.10.2020
comment
@ swift2geek конечно у меня его нет, у меня тогда был взломанный телефон. - person Roman Ermolov; 30.11.2020

В ответе Романа Ермолова поясняется, что некоторые приложения используют свои собственные UIView для этой функции, но не объясняет, как это сделать. На мой взгляд, у вас есть несколько вариантов.

Если вы хотите расположить представление поверх (и покрыть) текущий контроллер представления, вы можете создать UIView с UILabel или своим собственным UIWindow и добавить его как подвид keyWindow ваших приложений.

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

person JAL    schedule 08.08.2016