在iOS

时间:2017-11-20 18:46:15

标签: ios swift swift3 callkit

我一直在开发一个应用程序,用于存储组织内的所有联系人详细信息。主要目标是我的应用程序应该检测传入或传出呼叫,它应该显示该号码所属的人员。例如,这个应用程序将作为Truecaller应用程序。

我尝试使用Google搜索,发现无法在IOS中检测来电号码。

我在ios中阅读了CallKit并了解了Call Directory扩展。虽然我不清楚如何实施它&我不知道这件事是否能解决我的问题。

如果IOS设备接收到来自未知号码的呼叫,系统是否会选择我的应用并搜索未知号码的联系人,并在呼叫者屏幕上显示相关信息?或者还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

经过一些不眠之夜,我找到了解决问题的方法。

  1. 在Xcode中,转到文件 - >新 - >目标 enter image description here

  2. 选择“呼叫目录分机”并单击“下一步”

  3. enter image description here

    1. 并提供任何名称,然后单击“完成” enter image description here

    2. 现在您的应用应该与此类似 enter image description here

    3. 转到CallDirectoryExtension.swift并用此

      替换代码
      import Foundation 
      import CallKit
      class CallDirectoryHandler: CXCallDirectoryProvider {
      override func beginRequest(with context: CXCallDirectoryExtensionContext) {
          guard let phoneNumbersToBlock = retrievePhoneNumbersToBlock() else {
              NSLog("Unable to retrieve phone numbers to block")
              let error = NSError(domain: "CallDirectoryHandler", code: 1, userInfo: nil)
              context.cancelRequest(withError: error)
              return
          }
      
          for phoneNumber in phoneNumbersToBlock {
              context.addBlockingEntry(withNextSequentialPhoneNumber: CXCallDirectoryPhoneNumber(phoneNumber)!)
          }
      
          guard let (phoneNumbersToIdentify, phoneNumberIdentificationLabels) = retrievePhoneNumbersToIdentifyAndLabels() else {
              NSLog("Unable to retrieve phone numbers to identify and their labels")
              let error = NSError(domain: "CallDirectoryHandler", code: 2, userInfo: nil)
              context.cancelRequest(withError: error)
              return
          }
      
          for (phoneNumber, label) in zip(phoneNumbersToIdentify, phoneNumberIdentificationLabels) {
              context.addIdentificationEntry(withNextSequentialPhoneNumber: CXCallDirectoryPhoneNumber(phoneNumber)!, label: label)
          }
      
          context.completeRequest { (suc) in
              print(suc)
          }
      }
      
      private func retrievePhoneNumbersToBlock() -> [String]? {
          // retrieve list of phone numbers to block
          return ["+8612345678901","+8618180100980"]
      }
      
      private func retrievePhoneNumbersToIdentifyAndLabels() -> (phoneNumbers: [String], labels: [String])? {
          // retrieve list of phone numbers to identify, and their labels
          return (["+94123456789", "+94234567891"],
                  ["John Doe","Angelina Jollie",])
      }
      
      }
      

      现在运行并启动您的应用。然后转到设置 - >电话 - >呼叫拦截&识别然后打开许可。

      注意:如果您对CallDirectoryHandler中的联系人列表进行了任何更改,首先您必须关闭该权限,然后从您的设备中删除您的应用。

      每次更新列表时,每次调试应用时都会重做这些步骤。