我在单例中从 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)
}
}
我错过了什么?
虽然 @Stuart 的回答提出了很好的观点,但在我花了 1 个多小时找出为什么我的呼叫目录扩展不起作用之后,我想添加一些我自己的提示......
电话号码格式:检查您是否添加了国家代码。就我而言,我测试了澳大利亚手机号码,例如 0412345678,所以它应该是 61412345678 或 +61412345678。是的,两者都对我有用。
注意 iOS 缓存!每次重新启动或运行应用程序时,您在呼叫目录扩展中编写的内容不会被执行/调用。即,您认为您已在阻止数组中附加了一些新的电话号码,但 iOS 实际上可能不会按您的预期加载它。诀窍是在“设置”->“电话”->“呼叫阻止和识别”中切换应用程序的选项。
当需要重新加载以使 iOS 缓存失效时,您可能需要在主应用程序中调用 CXCallDirectoryManager.reloadExtension。
目前在 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 中查看“调用目录扩展”iOS 扩展模板,该模板已更新以演示新的增量加载 API:
检查您的联系人列表中的每个电话号码,如果列出任何没有国家代码的号码,则不会将其添加到阻止列表中,您必须提供国家代码+号码
将数组解析为阻塞函数时,应注意 5 点
它阻塞了阵列。有几个限制:-
我遵循了所有这些步骤,并且工作完美。
let arrayInt64 = decodedItems.map { str in if let intValue = Int64(str){ return intValue }else{ return 0 } }
import Algorithms let numbers = [1, 2, 3, 3, 2, 3, 3, 2, 2, 2, 1] print(numbers.uniqued()) // prints [1, 2, 3]
或
var uniqueArray : [Int64] = [] for element in arrayInt64{ if !uniqueArray.contains(element){ uniqueArray.append(element) } }
uniqueArray.sorted(by: <)