我想获取来电时的主叫方ID(电话号码)。 TrueCaller 已经实现了这一点,他们能够得到来电者的电话号码。
我找到了以下信息: 1. CoreTelephony 框架(仅提供呼叫状态) 2. 苹果的9.0更新: “可能”与邮件应用程序同步联系人,并检测到来电电话号码。
我想获取来电时的主叫方ID(电话号码)。 TrueCaller 已经实现了这一点,他们能够得到来电者的电话号码。
我找到了以下信息: 1. CoreTelephony 框架(仅提供呼叫状态) 2. 苹果的9.0更新: “可能”与邮件应用程序同步联系人,并检测到来电电话号码。
###EDIT###
iOS 10及以上版本:
使用Callkit,查看通话目录扩展。
根据文档,
识别来电者
当手机接收到来电时,系统会首先查询用户联系人以查找匹配的电话号码。如果没有找到匹配项,则系统会查询您的应用程序的通话目录扩展以查找匹配条目以标识电话号码。这对于维护与系统联系人分开的用户联系人列表(例如社交网络)的应用程序或用于识别可能从应用程序内启动的来电(例如客户服务支持或交付通知)非常有用。
例如,考虑一个在社交网络应用上与Jane是朋友,但没有将其电话号码添加到其联系人中的用户。社交网络应用具有通话目录扩展,可以下载并添加所有用户朋友的电话号码。因此,当用户从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()
}
}
因为此方法仅在系统启动应用扩展时调用,而不是针对每个单独的呼叫调用,因此您必须一次性指定所有呼叫身份识别信息;例如,您不能向 Web 服务发出请求以查找有关传入呼叫的信息。
iOS 9及更早版本:
如Kakshil所提到的,非越狱设备上无法使用来电显示。
我将给您一些关于Truecaller如何工作的发现:
它并不会读取通话历史记录,他们实际上创建了操作扩展,无论您在哪里共享联系人,它都会显示Truecaller应用程序扩展,这个扩展编码用于显示从其服务器获取的联系人详细信息
您可能也会因为某些电话而收到推送通知,称为“某些X正在呼叫您”。这就是Truecaller使用的一个技巧。如果您仔细注意,只有当您从已安装Truecaller的Android用户那里接听电话时,才会收到该推送通知。让我向您详细解释一下:
X(已安装Truecaller的Android用户)呼叫Y(已安装Truecaller的iOS用户),Android版本会通知服务器X正在给Y打电话。然后服务器将向Y的iPhone发送推送通知。
非越狱设备上无法使用来电显示。
但是有一种方法,可以知道哪个用户在打电话,但不确定对您是否有用。
如果您连接了蓝牙设备到iPhone上,它将获取所有通知,包括来电通知,然后您就可以获取来电者的ID。
除此之外,目前没有其他任何方法可以知道来电者ID。