2016-08-03 7 views
7

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

То, что я уже пробовал:

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

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


Edit: Поскольку никакого ответа не найден стандартный способ, чтобы сделать это, принял @ римскими Ермолами ответа. Для тех, кто будет искать ответ я могу предложить несколько вариантов, чтобы сделать это самостоятельно:

  1. Оберните корень ViewController внутри контейнера, как в Apple's iAdSuite with Storyboards example. Посмотрите, например, на мой sample project. Наверное, лучший способ сделать этот бар.
  2. Hack UINavigationBar высота (см this подхода) - не работает пейзаж еще, но, вероятно, может быть решена
  3. кадр управления вашим главного UIWindow в себя, поместите другой UIWindow под статусным с нужным содержанием.
+0

Был ли мой ответ полезным или, возможно, вы ищете детали реализации? Если да, не могли бы вы предоставить дополнительную информацию о своих требованиях? –

+0

Было очень полезно, спасибо. Я все еще надеюсь, что есть системный способ включения панели вызовов, если таковой имеется. Если никто этого не найдет, я приму ваш ответ –

ответ

5

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

Это Skype: Skype status bar

Это WhatsApp (Reveal не может получить реальный снимок, но он передает основную идею): enter image description here

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

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

1

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

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

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