CallKit不会阻止数组中的数字

时间:2017-08-22 21:35:22

标签: ios iphone swift callkit callblocking

我在单例中从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)
        }
    }

我错过了什么?

3 个答案:

答案 0 :(得分:1)

目前在iOS 10.x中,每次运行Call Directory扩展程序时,都必须提供完整的电话号码集,以阻止或标识标签。换句话说,如果它运行一次并添加被阻止的电话号码[A, B, C],并且您还希望屏蔽电话号码D,则下次运行扩展时它必须提供完整列表{{1 }}

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

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

请参阅https://developer.apple.com/documentation/callkit/cxcalldirectoryextensioncontext

上有关这些新API的文档

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

Xcode Call Directory Extension target template screenshot

答案 1 :(得分:1)

虽然@Stuart的回答很不错,但我花了1多个小时弄清楚为什么我的Call Directory扩展无法正常工作后,我还是想补充一些提示...

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

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

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

答案 2 :(得分:0)

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