ios - 在 iOS 中识别未知的 GSM 调用

标签 ios swift swift3 callkit

我一直在开发一款应用程序,用于存储组织内的所有联系人详细信息。主要目标是我的应用程序应该检测来电或去电,并且应该显示号码所属的人是谁。例如,此应用程序将用作 Truecaller 应用程序。

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

我阅读了 iOS 中的 CallKit 并了解了 Call Directory 扩展。虽然我不清楚如何实现它,但我不知道这是否能解决我的问题。

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

最佳答案

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

  1. 在 Xcode 中,转到文件 -> 新建 -> 目标
  2. 选择 Call Directory Extension 并单击 Next
  3. 然后给任何名字然后点击完成
  4. 现在您的应用应该与此类似

转到 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 中对您的联系人列表进行了任何更改,首先您必须关闭该权限,然后从您的设备中删除您的应用程序。

每次调试应用程序时,无论何时更新列表,都要重做这些步骤。

关于ios - 在 iOS 中识别未知的 GSM 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47399024/

相关文章:

ios - 如何对工具栏项应用约束

ios - 提交具有两个不同目标的iOS应用

ios - 如何在 Swift 中列出所有符合协议(protocol)的类?

javascript - 如何使用 swift3 从 alamofire 响应中获取字典数组的值

ios - 可能的 Facebook 文档错误导致 swift 代码无法编译?

ios - 显示对 Swift 类属性的引用

ios - 尝试访问自定义 UiView 中的高度属性,遇到 "height is a get-only property"错误

swift - 在 swift 2 中将特定字符串转换为 NSDate 对象

ios - 从旧 Swift 到 Swift 3

ios - 在ios上创建Firebase用户而不自动登录