如何使用 Call Kit 框架以编程方式获取来电电话号码。我尝试使用 cxcallobserver 类,但没有用。
任何最有帮助的建议...
使用 CallKit 的呼叫阻止和识别功能(iOS 10 中的新增功能)时,要阻止或识别的电话号码会在来电之前由应用程序的呼叫目录扩展加载,并且系统会存储电话号码。然后,当来电到达时,系统会查阅存储的数据,并且来电可能会被阻止或在来电 UI 中使用提供的标签进行识别。
出于隐私和性能原因,当来电到达且应用扩展无法检索来电的电话号码时,不会启动通话目录应用扩展。
iOS 10 中引入的通话目录扩展的工作方式类似于 iOS 9 中引入的 Safari 内容拦截器扩展。您的扩展必须提供电话号码列表(在 safari 的扩展中,它是一个 json 文件),这些号码将被存储通过iOS,当有来电时,系统会检查您的分机提供的列表(就像safari会在加载网站之前检查json文件指定的规则一样),前提是您的分机当时处于活动状态.
因此,使用此功能创建类似应用程序的来电显示是不可能的,因为事情不是动态的。 此外,您可以在列表中提供的电话号码数量可能会受到限制,希望在 iOS 10 版本中宣布这一点。
在 iOS 上,由于隐私限制,无法直接访问来电的电话号码。然而,有一个解决方法,利用 Apple 的 CallKit 及其呼叫目录扩展。
呼叫目录扩展允许应用程序向系统提供电话号码及其相应标签的列表。当有来电时,系统会检查此列表并显示应用程序提供的标签。
以下是如何实现这一点的基本概要:
创建呼叫目录扩展:在 Xcode 中,向项目添加新目标并选择呼叫目录扩展。这将设置一个带有 CallDirectoryHandler 类的新扩展,您将在其中编写代码。
提供电话号码和标签:在
beginRequest(with context: CXCallDirectoryExtensionContext)
类中实现 CallDirectoryHandler
方法。在这里,您可以将电话号码及其标签添加到上下文中。电话号码应以 64 位无符号整数形式提供,以 E.164 格式 表示,不带加号。
重新加载分机:添加或删除号码后,您必须重新加载分机以更新系统列表。这可以通过拨打
CXCallDirectoryManager.sharedInstance.reloadExtension(withIdentifier:completion:)
来完成。
需要注意的是,这种方法需要您提前知道电话号码,这可能并不适合所有场景。此外,您可以提供的电话号码数量可能有限制。
始终谨慎处理用户数据,确保维护隐私和安全。请求必要的权限并明确告知用户您的应用访问的数据。