【问题标题】:How to show double height green statusbar (In-Call) in foreground app on device?如何在设备的前台应用程序中显示双高绿色状态栏(通话中)?
【发布时间】:2016-08-03 08:21:04
【问题描述】:

这里有很多问题要求在后台显示红色录音栏。很明显,我应该为此使用AVAudioSession 类别AVAudioSessionCategoryPlayAndRecord。我的问题是,当我的应用程序中有活动的 VOIP 通话时,如何在前台应用程序中显示绿色的通话中栏(或至少是红色栏)?所以我可以点击状态栏区域返回调用 UI,就像 Whatsapp 或 Skype 一样。

我已经尝试过的:

  • voipaudio 模式在 UIBackgroundModes 中键入 Info.plist + setCategory:AVAudioSessionCategoryPlayAndRecord + setActive 建议 in this SO answer (在进入后台时给我一个红色状态栏,但在前台时没有)
  • 以前的 + AVAudioSession + setMode:AVAudioSessionModeVoiceChat - 没用
  • 在 pjsip 源代码中将kCFStreamNetworkServiceTypeVoIP 标志设置为套接字并重新编译它 - 没有帮助。此外,自 iOS 8 起已弃用。
  • 创建了一个单独的套接字,为 inputStream/outputStream 设置了 voip 标志:[self.inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType](从here获取示例代码)

使用 pjsip 进行调用。我还能尝试什么来增加状态栏高度,将所有 UI 向下移动? 是否有任何标准方法可以做到这一点,或者我应该通过调整根 UIWindow 的大小并在状态栏下设置另一个绿色 UIWindow 来破解它?


编辑: 由于没有找到标准方法的答案,因此接受了@roman-ermolov 答案。对于那些要寻找答案的人,我可能会建议几个自己做的选择:

  1. 将根视图控制器包装在容器中,例如 Apple's iAdSuite with Storyboards example。以我的sample project 为例。可能是制作那个酒吧的最佳方式。
  2. Hack UINavigationBar 高度(参见this 方法)- 不适用于横向,但可能会解决
  3. 自己控制主 UIWindow 的框架,在状态栏下方放置另一个 UIWindow 并包含所需的内容。

【问题讨论】:

  • 我的回答是否有帮助,或者您可能正在寻找实施细节?如果是这样,您能否提供有关您的要求的更多信息?
  • 非常有帮助,谢谢。我仍然希望有一种系统方法可以打开通话栏,如果有的话。如果没有人发现这个,我会接受你的回答
  • 请您在我的 Android 应用程序中为我提供答案吗?
  • 我不是 Android 开发人员,但我相信您可以使用相同的技术实现相同的目标 - 将所有 UI 嵌入到容器中,并在需要时减小其大小
  • 您的示例项目是迄今为止我遇到的最佳解决方案。我已经检查了您的示例项目,它可以工作,但它与 iPhone X+ 设备几乎没有问题。点击呼叫栏不起作用。您能更新您的示例项目吗?

标签: ios voip pjsip uistatusbar in-call


【解决方案1】:

我对这两个应用程序(WhatsApp 和 Skype)进行了调查,并了解到他们使用自己的 UIView 来实现此功能。

这是 Skype:

这是 WhatsApp(Reveal 无法获得真实快照,但它传达了基本思想):

在这两个应用程序中,它都是一个从屏幕顶部开始的 UIView,以及用于格式化输出文本/处理触摸的几种方法。

Apple 在 iOS 10 中引入了CallKit.framework,但它似乎也没有那种功能,所以唯一的办法就是自己动手。

【讨论】:

  • 如果您不是 Skype 和 whatsapp 应用程序的开发人员并且它没有 opensosurced,您是如何看到它们的层次结构的?
  • Ermolov 这还在 ios 11 中工作吗?我试图附加到该过程,但似乎 IM 无法这样做。我猜你没有 whatsapp 或 skype 的源代码才能在 xcode 中运行它,对吗?
  • 你知道点击顶部栏时返回用户调用 UI 的代码是什么吗?
  • @swift2geek 我当然没有,当时我的手机越狱了。
【解决方案2】:

Roman Ermolov 的回答解释说,一些应用程序使用自己的 UIView 来实现此功能,但没有解释如何使用。在我看来,你有几个选择。

如果您想将视图放置在(并覆盖)当前视图控制器的顶部,您可以使用 UILabel 或您自己的 UIWindow 创建一个 UIView,并将其添加为您的应用程序的子视图keyWindow.

要让视图贴在顶部而不覆盖视图控制器的内容,您可以采用与上述相同的方法,并在添加调用栏子视图时手动调整应用程序窗口或窗口的根视图控制器的大小。或者,您可以创建一个 UIViewController 基类,其中包含此调用栏子视图和视图高度约束的出口。此约束的默认值应为零。然后,当拨打电话时,将高度限制更改为您想要的回调高度。这种约束方法可能也适用于应用程序的UIWindow,但我不太熟悉在应用程序的窗口上使用约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2015-03-22
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多