25

我环顾四周,我能找到的只是检查 CTCallCenter 的 callState。但是,这是通过监听事件来工作的——这取决于应用程序是否处于活动/暂停/恢复状态,可以在不同的时间引发事件。

我需要的不是听事件并在呼叫连接时被告知,我想自己决定何时询问呼叫是否已连接。

用例:当电话接通时 - 用户知道并且将始终单击应用程序图标,这将打开应用程序。此时我只想运行一个快速函数来检查当前是否正在通话。

这甚至可能吗?

4

4 回答 4

28

CTCallCenter对象具有一个currentCalls属性,该属性是NSSet当前调用的一个。如果有电话,则该currentCalls属性应为 != nil。

如果您想知道是否有任何呼叫实际连接,那么您必须遍历当前呼叫并检查callState以确定是否连接CTCallStateConnected

于 2012-06-08T02:31:19.143 回答
27
#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>

-(bool)isOnPhoneCall {
    /*

     Returns TRUE/YES if the user is currently on a phone call

     */

    CTCallCenter *callCenter = [[[CTCallCenter alloc] init] autorelease];
    for (CTCall *call in callCenter.currentCalls)  {
        if (call.callState == CTCallStateConnected) {
            return YES;
        }
    }
    return NO;
}
于 2012-10-29T06:09:43.477 回答
6

感谢ThomasW 的回答。我想我也会发布代码。

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    CTCallCenter *ctCallCenter = [[CTCallCenter alloc] init];
    if (ctCallCenter.currentCalls != nil) 
    {
        NSArray* currentCalls = [ctCallCenter.currentCalls allObjects];
        for (CTCall *call in currentCalls)
        {   
            if(call.callState == CTCallStateConnected)
            {
                // connected
            }
        }
    }
}
于 2012-06-08T06:38:14.097 回答
2

我遇到了同样的问题,但我认为从iOS 10执行此操作的正确方法是:

func checkForActiveCall() -> Bool {
    for call in CXCallObserver().calls {
        if call.hasEnded == false {
            return true
        }
    }
    return false
}
于 2019-11-12T07:49:41.373 回答