CallKit 不会阻止数组中的数字

问题描述 投票:0回答:5

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

我错过了什么?

ios iphone swift callkit callblocking
5个回答
3
投票

虽然 @Stuart 的回答提出了很好的观点,但在我花了 1 个多小时找出为什么我的呼叫目录扩展不起作用之后,我想添加一些我自己的提示......

  1. 电话号码格式:检查您是否添加了国家代码。就我而言,我测试了澳大利亚手机号码,例如 0412345678,所以它应该是 61412345678 或 +61412345678。是的,两者都对我有用。

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

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


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 时,您的扩展必须始终检查当前是否允许增量加载。系统有时可能需要重新加载完整电话号码列表,并且您的分机必须能够提供完整列表。

请参阅这些新 API 的文档:https://developer.apple.com/documentation/callkit/cxcalldirectoryextensioncontext

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

Xcode Call Directory Extension target template screenshot


1
投票

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


1
投票

将数组解析为阻塞函数时,应注意 5 点

  1. 检查设置中的 Extension 是否已启用(向您的应用程序扩展授予权限
  2. 必须包含国家/地区代码
  3. 数组必须按升序排列。 对数组进行排序时,它应该是整数或任何数字形式(不要以字符串形式对数组进行排序)
  4. 数组中不应该有任何重复的数字
  5. 应该有正确的号码(你不应该像这样屏蔽123,不要写错号码)

0
投票

它阻塞了阵列。有几个限制:-

我遵循了所有这些步骤,并且工作完美。

  1. 当您安装具有分机的应用程序时,请确保从“设置”->“电话”->“呼叫阻止和识别”启用分机,打开分机的开关。
  2. 验证电话号码,只是为了确保您没有输入无效号码,因为一个错误的号码将使号码阻止失效。使用PhoneNumberKit,它是一个很棒的库。 https://github.com/marmelroy/PhoneNumberKit
  3. 记住排序数组不适用于字符串数组。确保将数组字符串转换为 Int64。
let arrayInt64 = decodedItems.map { str in
    if let intValue = Int64(str){
       return intValue
    }else{
       return 0
    }
}
  1. 确保在传递给 context.addBlockingEntry 之前删除重复项
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)
    }
}
  1. 最重要的是按升序对数组进行排序。
uniqueArray.sorted(by: <)
© www.soinside.com 2019 - 2024. All rights reserved.