我环顾四周,我能找到的只是检查 CTCallCenter 的 callState。但是,这是通过监听事件来工作的——这取决于应用程序是否处于活动/暂停/恢复状态,可以在不同的时间引发事件。
我需要的不是听事件并在呼叫连接时被告知,我想自己决定何时询问呼叫是否已连接。
用例:当电话接通时 - 用户知道并且将始终单击应用程序图标,这将打开应用程序。此时我只想运行一个快速函数来检查当前是否正在通话。
这甚至可能吗?
我环顾四周,我能找到的只是检查 CTCallCenter 的 callState。但是,这是通过监听事件来工作的——这取决于应用程序是否处于活动/暂停/恢复状态,可以在不同的时间引发事件。
我需要的不是听事件并在呼叫连接时被告知,我想自己决定何时询问呼叫是否已连接。
用例:当电话接通时 - 用户知道并且将始终单击应用程序图标,这将打开应用程序。此时我只想运行一个快速函数来检查当前是否正在通话。
这甚至可能吗?
该CTCallCenter
对象具有一个currentCalls
属性,该属性是NSSet
当前调用的一个。如果有电话,则该currentCalls
属性应为 != nil。
如果您想知道是否有任何呼叫实际连接,那么您必须遍历当前呼叫并检查callState
以确定是否连接CTCallStateConnected
。
#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;
}
感谢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
}
}
}
}
我遇到了同样的问题,但我认为从iOS 10执行此操作的正确方法是:
func checkForActiveCall() -> Bool {
for call in CXCallObserver().calls {
if call.hasEnded == false {
return true
}
}
return false
}