【问题标题】:get phone call states in iOS 10在 iOS 10 中获取电话状态
【发布时间】:2017-02-22 14:18:45
【问题描述】:

我想在我的应用中获取电话状态。
经过一番搜索,我找到了CoreTelephony 框架。但这在 iOS 10 中已被弃用。那么还有其他可用的替代方法吗?
我还找到了CallKit。 iOS 10 中的一个新框架。但没有得到与我搜索相同的调用状态。

【问题讨论】:

  • 你想用“通话状态”这个词表达什么?能否请您详细说明。
  • 'dialing', 'disconnected', 'connected' 类似电话呼叫的状态。
  • 所以你想要一些代表,当任何呼叫转换发生时,它会给你这样的状态,对吗?
  • 我认为,this CTCallCTCallCenter 提供了我想要的信息。
  • @DeathStroke 如果某些答案对您有帮助,请将其中一个标记为已接受What does it mean when an answer is "accepted"?

标签: ios ios10 core-telephony callkit


【解决方案1】:

Apple 不允许您访问这些信息,尽管您可以通过使用第三方库来访问这些信息,但您的应用在提交到 App Store 时会被拒绝,因为 Apple 不允许访问敏感的用户信息。

【讨论】:

  • 这不是真的,关于电话状态的信息可以通过公共API获取。看看其他答案。
【解决方案2】:

有一些可用的委托方法可以指示呼入和呼出状态。

见:https://developer.apple.com/reference/callkit

【讨论】:

  • 谢谢哥们,我不知道,我显示相同的链接,但为什么没有找到协议。
【解决方案3】:

要获得有关电话状态的通知,从 iOS 10 开始,您应该使用CXCallObserver 类并实现其CXCallObserverDelegate 协议方法,这在this 答案中建议:

- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    if (call.hasConnected) {
        // perform necessary actions
    }
}

【讨论】:

    【解决方案4】:

    你可以试试这个代码:

    1. 创建调用观察者实例

      @property ( nonatomic ) CXCallObserver *callObserver;
      
    2. 启动实例并设置委托

      _callObserver = [CXCallObserver new];
              [_callObserver setDelegate:self queue:dispatch_get_main_queue()];
      
    3. 添加调用观察委托

      - (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call{
      
          if (call == nil || call.hasEnded == YES) {
              NSLog(@"CXCallState : Disconnected");
          }
      
          if (call.isOutgoing == YES && call.hasConnected == NO) {
              NSLog(@"CXCallState : Dialing");
          }
      
          if (call.isOutgoing == NO  && call.hasConnected == NO && call.hasEnded == NO && call != nil) {
              NSLog(@"CXCallState : Incoming");
          }
      
          if (call.hasConnected == YES && call.hasEnded == NO) {
              NSLog(@"CXCallState : Connected");     
          }
      }
      

    在 Swift 4.2 中:

    var callObserver: CXCallObserver()
    
    callObserver.setDelegate(self, queue: DispatchQueue.main)
    
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
    
        if call == nil || call.hasEnded == true {
            print("CXCallState : Disconnected")
        }
    
        if call.isOutgoing == true && call.hasConnected == false {
            print("CXCallState : Dialing")
        }
    
        if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false && call != nil {
            print("CXCallState : Incoming")
        }
    
        if call.hasConnected == true && call.hasEnded == false {
            print("CXCallState : Connected")
        }
    }
    

    【讨论】:

      【解决方案5】:

      import CallKit 到您的AppDelegate 并添加以下代码:

      // AppDelegate
      var callObserver: CXCallObserver! // add property
      
      // in applicationDidFinishLaunching...
      callObserver = CXCallObserver()
      callObserver.setDelegate(self, queue: nil) // nil queue means main thread
      
      extension AppDelegate: CXCallObserverDelegate {
          func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
              if call.hasEnded == true {
                  print("Disconnected")
              }
              if call.isOutgoing == true && call.hasConnected == false {
                  print("Dialing")
              }
              if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false {
                  print("Incoming")
              }
      
              if call.hasConnected == true && call.hasEnded == false {
                  print("Connected")
              }
          }
      }
      

      【讨论】:

      • 我们可以在后台执行此操作吗?
      • 是的,当您的应用处于前台或后台时,这将起作用。
      • 它只在后台工作了大约 3 分钟,然后就不起作用了……我编写了以下解决方案 stackoverflow.com/questions/43044035/…,我在其中展示了我是如何从后台调用它的。它工作了3分钟左右,然后不起作用。甚至在它上面放置了一个过期的赏金现在放置另一个赏金
      • @BrandonA 只是标记您以引起注意:)。又开始了一项价值 100 分的新赏金活动。
      • 这仅适用于 VOIP 通话还是也适用于蜂窝电话?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多