3

我在单例中从 CNContact 创建数字数组。但是当我重新加载我的 CallKit 扩展时,CallKit 不会阻止我之前阻止的号码。号码长度为 11 个字符。数组不为空。重新加载 CallKit Extension 后没有错误。

static let shared = BlockNumbersManager()
    private init() { }
    open var blockNumbers: [CXCallDirectoryPhoneNumber] = []
open func getIntegerBlockNumbers() -> [CXCallDirectoryPhoneNumber] {
        return blockNumbers
    }



private func addBlockingPhoneNumbers(to context: CXCallDirectoryExtensionContext) throws {
        let phoneNumbers: [CXCallDirectoryPhoneNumber] = BlockNumbersManager.shared.getIntegerBlockNumbers() // TODO: add numbers for block dynamically.
        for phoneNumber in phoneNumbers {
            context.addBlockingEntry(withNextSequentialPhoneNumber: phoneNumber)
        }
    }

我错过了什么?

4

3 回答 3

1

虽然@Stuart 的回答提出了很好的观点,但在我花了 1 个多小时来弄清楚为什么我的呼叫目录扩展程序不起作用之后,我想从我身边添加一些提示......

  1. 电话号码格式:检查您是否添加了国家代码。就我而言,我使用澳大利亚手机号码(例如 0412345678)进行了测试,因此它应该是 61412345678 或 +61412345678。是的,两者都为我工作。

  2. 注意iOS缓存!每次重新启动或运行应用程序时,您在呼叫目录扩展程序中编写的内容都不会被执行/调用。即您认为您在阻塞数组中添加了一些新的电话号码,但实际上 iOS 可能无法按您的预期加载它。诀窍是在设置 -> 电话 -> 呼叫阻止和识别中切换应用程序的选项。

  3. 当需要重新加载以使 iOS 缓存失效时,您可能需要在主应用程序中调用CXCallDirectoryManager.reloadExtension 。

于 2018-11-23T02:42:03.843 回答
1

检查联系人列表中的每个电话号码,如果列出了没有国家代码的号码,则不会将其添加到阻止列表中,您必须提供国家代码+号码

于 2019-09-02T06:58:52.250 回答
1

目前在 iOS 10.x 中,每次您的呼叫目录扩展程序运行时,它都必须提供一组完整的电话号码来阻止或使用标签进行识别。换句话说,如果它运行一次并添加了被阻止的电话号码[A, B, C],并且您还希望阻止电话号码D,那么下次运行扩展程序时,它必须提供完整的列表[A, B, C, D]

在 iOS 11 中,添加了一些新的 API,允许扩展尽可能增量地提供数据。例如,如果扩展程序已经运行过一次并添加了被阻止的电话号码[A, B, C],并且您还希望阻止电话号码D,那么下次运行扩展程序时,它可能首先检查系统是否允许增量加载,如果允许,则可以添加屏蔽号码[D],屏蔽号码的完整列表将变为[A, B, C, D]

请注意,当使用新的 iOS 11 增量加载 API 时,您的扩展必须始终检查当前是否允许增量加载。系统有时可能需要重新加载完整的电话号码列表,您的分机必须能够提供完整的列表。

在https://developer.apple.com/documentation/callkit/cxcalldirectoryextensioncontext查看这些新 API 的文档

此外,您可以在 Xcode 9 中查看“调用目录扩展”iOS 扩展模板,该模板已更新以演示新的增量加载 API:

Xcode 呼叫目录扩展目标模板截图

于 2017-08-26T22:26:18.950 回答