【问题标题】:Core Telephony -- Call Event Handler核心电话——呼叫事件处理程序
【发布时间】:2010-09-16 06:29:30
【问题描述】:

我希望在我的应用从后台恢复活动状态后检测通话状态。我为此使用以下代码:

CTCallCenter *callCenter = [[CTCallCenter alloc] init];

callCenter.callEventHandler=^(CTCall* call)
{

  if (call.callState == CTCallStateDisconnected)
 { 

  NSLog(@"Call has been disconnected");

  }

  else if (call.callState == CTCallStateConnected) 
  {

NSLog(@"Call has just been connected");

  }

else if(call.callState == CTCallStateConnected)
  {

   NSLog(@"Call is incoming");

  }

  else
  {

   NSLog(@"None of the conditions");

  }

};

现在,当应用打开时用户收到呼叫时,这可以正常工作。断开呼叫后,应用程序会自动返回前台,并正确检测到呼叫状态已断开。

但是,如果应用程序在接听电话之前是后台运行的,那么当应用程序回到前台时,如果我运行上面的代码,它就无法检测到通话状态。这令人费解,因为苹果文档指出:

如果您的应用程序在调用事件发生时处于活动状态,则系统会立即将该事件分派给您的处理程序。但是,调用事件也可能在您的应用程序暂停时发生。当它被挂起时,您的应用程序不会收到呼叫事件。当您的应用程序恢复活动状态时,它会为每个更改状态的调用接收一个调用事件 - 无论您的应用程序暂停时调用经历了多少状态更改。当您的应用程序返回活动状态时,发送到您的处理程序的单个调用事件描述了当时调用的状态。

所以我相信,当我的应用程序恢复活动状态并运行呼叫事件处理程序块时,它应该检测到呼叫刚刚断开。但是,调用事件处理程序块本身并未执行,即它跳过所有“if else”条件并退出该块。

谁能解释为什么会这样?任何帮助将非常感激。谢谢。

【问题讨论】:

  • 如果你想在后台监控通话,最好的办法是成为一个后台应用程序(例如注册一个后台模式,location)并定期检查callCenter.currentCalls。在此处查看我的答案以获取更多详细信息:stackoverflow.com/questions/10102108/….

标签: iphone core-telephony


【解决方案1】:

Nathan,您是否在每次应用程序进入后台时都重新创建 CTCallCenter 实例? ,如果是,那么这可能是问题所在。

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2022-07-30
    相关资源
    最近更新 更多