【问题标题】:Identify unknown GSM calls in iOS在 iOS 中识别未知的 GSM 呼叫
【发布时间】:2017-11-20 18:46:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • CallKit 文档中直接有一个部分,请参阅developer.apple.com/documentation/callkit
  • 是的,你需要通过CallKit实现调用者识别。您需要编写一个扩展程序,通过扩展程序向 iOS 注册您的姓名和号码
  • 谢谢你给了我一些希望。你有什么资料可以参考吗?

标签: ios swift swift3 callkit


【解决方案1】:

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

  1. 在 Xcode 中,转到文件 -> 新建 -> 目标
  2. 选择呼叫目录分机并单击下一步
  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 中的联系人列表进行了任何更改,首先您必须关闭权限,然后从您的设备中删除您的应用程序。

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

【讨论】:

  • 呼叫拦截和识别功能没有关闭,提示应用提供的数据无效。
  • 检查您的号码列表。它应该按升序排列
  • @ShiranGabriel 所以如果我用新号码更新实时应用程序,那么用户也必须重新安装应用程序?
  • 你好@ShiranGabriel,有没有办法阻止拨出电话?
  • @MannamBrahmam Nop
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多