CallKit не блокирует числа из массива

Я создаю массив чисел из 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)
        }
    }

Что я пропустил?

5 ответов

Хотя ответ @Stuart дает довольно хорошие замечания, я хотел бы добавить некоторые советы со своей стороны, после того, как я потратил более 1 часа, чтобы выяснить, почему мое расширение Call Directory не работает...

  1. Формат номера телефона: проверьте, добавили ли вы код страны. В моем случае я проверил с австралийским номером мобильного телефона, таким как 0412345678, поэтому он должен быть либо 61412345678, либо +61412345678. Да, у меня оба работали.

  2. Следите за кешем iOS! То, что вы написали в своем расширении Call Directory, не будет выполняться / вызываться при каждом перезапуске или запуске приложения. то есть вы думаете, что добавили несколько новых телефонных номеров в массив блокировки, но iOS на самом деле может не загрузить его, как вы ожидали. Хитрость заключается в том, чтобы переключить опцию вашего приложения в Настройки -> Телефон -> Блокировка вызовов и идентификация.

  3. Возможно, вы захотите вызвать CXCallDirectoryManager.reloadExtension в вашем основном приложении, когда требуется перезагрузка для аннулирования кэша iOS.

при анализе массива для функции блокировки вы должны обратить внимание на 5 моментов

  1. Убедитесь, что расширение включено в настройках (дайте разрешение расширению вашего приложения).
  2. должен включать код страны
  3. Массив должен быть в порядке возрастания. пока вы сортируете массив, он должен быть в целочисленной или любой числовой форме (не сортируйте массив в строковой форме)
  4. В массиве не должно быть повторяющихся чисел.
  5. должны быть правильные номера (не блокируйте 123, не ошибитесь с номером)

Проверьте каждый номер телефона в своем списке контактов, если в списке есть какой-либо номер без кода страны, он не будет добавлен в список блокировки, вы должны указать код страны + номер

В настоящее время в iOS 10.x каждый раз, когда работает ваш добавочный номер, он должен предоставить полный набор телефонных номеров, которые нужно заблокировать или идентифицировать по метке. Другими словами, если он запускается один раз и добавляет заблокированные номера телефонов [A, B, C], и вы хотите также заблокировать номер телефона Dзатем при следующем запуске расширения он должен предоставить полный список [A, B, C, D],

В iOS 11 были добавлены некоторые новые API, которые позволяют расширению предоставлять данные постепенно, когда это возможно. Например, если добавочный номер уже запущен один раз и добавлены заблокированные номера телефонов [A, B, C], и вы хотите также заблокировать номер телефона D, затем при следующем запуске расширения он может сначала проверить, разрешает ли система добавочную загрузку, и если это так, он может добавить заблокированные номера. [D] и полный список заблокированных номеров станет [A, B, C, D],

Обратите внимание, что при использовании новых API добавочной загрузки iOS 11 ваше расширение всегда должно проверять, разрешена ли добавочная загрузка в настоящее время. Системе иногда может потребоваться перезагрузить полный список телефонных номеров, и ваш добавочный номер должен быть в состоянии предоставить полный список.

См. Документацию для этих новых API по адресу https://developer.apple.com/documentation/callkit/cxcalldirectoryextensioncontext

Кроме того, вы можете просмотреть шаблон расширения iOS 'Call Directory Extension' в Xcode 9, который был обновлен для демонстрации новых API добавочной загрузки:

Скриншот шаблона расширения каталога вызовов Xcode

Он блокирует массив. Есть несколько ограничений: -

Я выполнил все эти шаги, и все работает безупречно.

  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: <)
Другие вопросы по тегам