从 iPhone 的来电中获取呼叫者 phone 的号码

Get the callers phone number from an incoming call on iPhone

我正在尝试在来电时获取来电显示(phone 号码)。 TrueCaller 已经实现了这一点,他们获得了 phone 来电号码。

我找到了以下信息: 1. CoreTelephony Framework(只给出调用状态) 2. Apple 9.0 更新:"Maybe" 联系人同步。使用邮件应用程序并检测传入的 phone 号码。

非越狱设备无法显示来电显示。

不过有一种方法,你可以知道是哪个用户打来的,但不确定对你是否有用。

如果您有连接到 iPhone 的蓝牙设备,它将收到所有通知,包括来电,然后您可以获得来电显示。

除此之外,目前根本没有其他方法可以知道被叫ID。

###编辑###

iOS 10岁以上:

使用Callkit,看看呼叫目录扩展

根据文档,

识别来电者

当 phone 接到来电时,系统首先会查询用户的联系人以找到匹配的 phone 号码。如果未找到匹配项,系统会查询您应用程序的呼叫目录扩展以找到匹配的条目来识别 phone 号码。这对于维护与系统联系人分开的用户联系人列表的应用程序(例如社交网络)或识别可能从应用程序内发起的来电(例如客户服务支持或送货通知)非常有用.

例如,考虑一个用户在社交网络应用中与 Jane 成为朋友,但她的联系人中没有她的 phone 号码。社交网络应用程序有一个呼叫目录扩展,它下载并添加用户所有朋友的 phone 号码。因此,当用户接到 Jane 的来电时,系统会显示类似“(应用程序名称)来电显示:Jane Appleseed”的内容,而不是“未知来电者”。

要提供有关来电者的识别信息,您可以在 beginRequest(with:) 的实现中使用 addIdentificationEntry(withNextSequentialPhoneNumber:label:) 方法。

class CustomCallDirectoryProvider: CXCallDirectoryProvider {
    override func beginRequest(with context: CXCallDirectoryExtensionContext) {
        let labelsKeyedByPhoneNumber: [CXCallDirectoryPhoneNumber: String] = [ … ]
        for (phoneNumber, label) in labelsKeyedByPhoneNumber.sorted(by: <) {
            context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)        
        }

        context.completeRequest()
    }
}

由于该方法只在系统启动app extension时调用,而不是每次调用都调用,所以必须一次性指定调用标识信息;例如,您不能向 Web 服务发出请求以查找有关来电的信息。

iOS 9 及更早版本:

正如 Kakshil 所提到的,来电显示在非越狱设备上是不可能的。

我会给你一些关于真实呼叫者如何工作的发现,

  1. 它不是在读取通话记录,他们实际上创建了 Action extension,无论你尝试分享联系人,它都会显示 truecaller 应用程序扩展,编码用于显示联系人 从他们的服务器获取的详细信息

  2. 您可能还会对少数人收到的推送通知感到困惑 打电话,说 "Some X calls you"。这就是 truecaller 使用技巧的地方。如果你 清楚地注意到,只有在 您接到安装了 truecaller 的 android 用户的电话。让 我给你详细解释一下,

X(android 用户安装了 truecaller),调用 Y(ios 用户安装了 truecaller),android 版本通知服务器 X 调用 Y。并且服务器将向 Y 的 iPhone.

发送推送通知