【问题标题】:iOS How to check if currently on phone calliOS如何检查当前是否正在通话
【发布时间】:2012-06-08 02:25:02
【问题描述】:

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

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

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

这可能吗?

【问题讨论】:

    标签: iphone objective-c ios xcode phone-call


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了...正是我需要的谢谢。如果你们认为这个问题有帮助,也请点赞。
    • 你救了我的命
    【解决方案2】:
    #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;
    }
    

    【讨论】:

    • 在 Xcode 7 for iOS 9.x 中构建时这似乎不起作用
    【解决方案3】:

    感谢 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
                }
            }
        }
    }
    

    【讨论】:

    • 您可以通过使用快速枚举大大缩短此代码:for (CTCall *call in ctCallCenter.currentCalls) {...}。您无需检查 nil 或将集合转换为数组。
    • 你能建议你的代码然后 omz 吗?如果它只是邦格的帖子并且更有效率和效果,我会非常乐意支持你的答案。干杯 omz。
    • 正是我需要的!赞成! @AlBeebe:currentCalls 用于下一行。
    【解决方案4】:

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

    func checkForActiveCall() -> Bool {
        for call in CXCallObserver().calls {
            if call.hasEnded == false {
                return true
            }
        }
        return false
    }
    

    【讨论】:

    • 为什么我总是在关闭应用程序时得到 hasEnded = false?
    • 即使关闭了最后一个通话,双击主页,这里没有通话系统
    • 适用于 iOS 14 和 13。这是正确的答案,因为 CTCallCenter 目前是一个已弃用的 API
    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多