2

CTCallCenter在启动后创建了一个实例(alloc/init)。事件处理程序永远不会被调用(既不是NSLog也不是breakpoint火灾)。如果我稍后询问有关当前调用的信息,它会返回 nil。如果我[[[CTCallCenter alloc] init] currentCalls]同时打电话,那么它确实会返回电话。

例如,当调用处于活动状态时(我将应用程序带回前台并随后触发了一个计时器),这里有一个NSLog显示长期存在的CTCallCenter实例、它为 currentCalls 返回的内容以及新的瞬态实例返回的内容:

CTCallCenter(0x1e5639c0): {
    server_connection: 0x1e5640e0   currentCalls: {(
)}  callEventHandler: 0xa0c90
}

(null) 

{(
    CTCall (0x1e5a0fb0) {
    callState: [CTCallStateIncoming]
    Call ID: [1EB2A082-4A12-48C2-A76C-2244F8F402EE]
}

)}

很明显,注册了一个处理程序,并且长期存在的实例认为没有调用。我很高兴总是使用瞬态实例来获取调用列表,但我确实需要触发事件处理程序。

4

1 回答 1

7

我找到了答案。[[CTCallCenter alloc] init]必须在主队列中运行。我在自定义串行调度队列中运行它。推测CTCallCenter代码正在对当前队列执行某些操作,或者可能需要运行循环。

如果您在主队列之外执行alloc/ init,那么如果立即调用 currentCalls 将是正确的,但该数据永远不会更新,事件处理程序也不会触发。文档中没有提到这一点,也没有errors返回或引发异常。

于 2013-02-06T12:39:50.073 回答