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 не работает...
Формат номера телефона: проверьте, добавили ли вы код страны. В моем случае я проверил с австралийским номером мобильного телефона, таким как 0412345678, поэтому он должен быть либо 61412345678, либо +61412345678. Да, у меня оба работали.
Следите за кешем iOS! То, что вы написали в своем расширении Call Directory, не будет выполняться / вызываться при каждом перезапуске или запуске приложения. то есть вы думаете, что добавили несколько новых телефонных номеров в массив блокировки, но iOS на самом деле может не загрузить его, как вы ожидали. Хитрость заключается в том, чтобы переключить опцию вашего приложения в Настройки -> Телефон -> Блокировка вызовов и идентификация.
Возможно, вы захотите вызвать CXCallDirectoryManager.reloadExtension в вашем основном приложении, когда требуется перезагрузка для аннулирования кэша iOS.
при анализе массива для функции блокировки вы должны обратить внимание на 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 добавочной загрузки:
Он блокирует массив. Есть несколько ограничений: -
Я выполнил все эти шаги, и все работает безупречно.
- При установке приложения с расширением убедитесь, что вы включили свое расширение в меню «Настройки» -> «Телефон» -> «Блокировка и идентификация вызовов» и включите переключатель для своего расширения.
- Подтвердите номер телефона, просто чтобы убедиться, что вы не вводите неверные номера, потому что один неправильный номер приведет к отмене блокировки номера. Используйте PhoneNumberKit, это отличная библиотека.https://github.com/marmelroy/PhoneNumberKit
- Помните, что сортировка массива не работает с массивом строк. Убедитесь, что вы конвертируете строку массива в Int64.
let arrayInt64 = decodedItems.map { str in if let intValue = Int64(str){ return intValue }else{ return 0 } }
- Убедитесь, что вы удалили дубликаты перед переходом к 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) } }
- Самое важное сортируйте массив в порядке возрастания.
uniqueArray.sorted(by: <)