在iOS中识别未知的GSM呼叫

问题描述 投票:0回答:1

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

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

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

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

ios swift swift3 callkit
1个回答
1
投票

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

  1. 在Xcode中,转到文件 - >新建 - >目标enter image description here
  2. 选择Call Directory Extension并单击Next

enter image description here

  1. 并提供任何名称,然后单击完成enter image description here
  2. 现在你的应用应该看起来类似于这个enter image description here

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

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

© www.soinside.com 2019 - 2024. All rights reserved.