我从CNContact中创建了一个数字数组。但是当我重新加载我的CallKit扩展时,CallKit不会阻止我之前阻止的数字。数字长度为11个字符。数组不为空。重新加载CallKit扩展后没有错误。
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条答案
按热度按时间rfbsl7qr1#
虽然@Stuart的回答提出了很好的观点,但我想从我这边添加一些提示,在我花了1个多小时来弄清楚为什么我的呼叫目录扩展不起作用之后......
1.电话号码格式:检查你是否已经添加了国家代码.在我的情况下,我测试了澳大利亚的移动的号码像0412345678,所以它应该是要么61412345678,或+61412345678.是的,都为我工作.
1.请注意iOS缓存!您在呼叫目录扩展中写入的内容不会在每次重新启动或运行应用程序时执行/调用。也就是说,您认为您在阻止数组中添加了一些新的电话号码,但iOS实际上可能不会像您预期的那样加载它。诀窍是在设置-〉电话-〉呼叫阻止和识别中切换应用程序的选项。
1.当需要重新加载以使iOS缓存失效时,您可能需要在主应用中调用CXCallDirectoryManager.reloadExtension。
unhi4e5o2#
目前在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时,您的扩展必须始终检查当前是否允许增量加载。系统可能偶尔需要重新加载电话号码的 * 完整 * 列表,您的扩展必须能够提供完整的列表。
有关这些新API的文档,请参见https://developer.apple.com/documentation/callkit/cxcalldirectoryextensioncontext
此外,您可以在Xcode 9中查看'Call Directory Extension' iOS扩展模板,该模板已更新以演示新的增量加载API:
bakd9h0s3#
检查您的联系人列表中的每个电话号码,如果没有国家代码的任何号码被列出,那么它将不会被添加到阻止列表,您必须提供国家代码+号码