Как исправить 'sqlite3' и другие ошибки в расширении CallKit Directory? - PullRequest
1 голос
/ 04 ноября 2019

Идея приложения состоит в том, чтобы добавить около 50 000 контактов в каталог CallKit, но когда я пытаюсь добавить их с помощью context.addIdentificationEntry(withNextSequentialPhoneNumber: contact.number, label: contact.contactLabel) в методе beginRequest(with context: CXCallDirectoryExtensionContext), я часто получаю либо com.apple.CallKit.error.calldirectorymanagerошибка 2 или какая-то странная ошибка sqlite3:

sqlite3_step for query 'INSERT INTO PhoneNumberIdentificationEntry 
(extension_id, phone_number_id, label_id) VALUES (?, (SELECT id 
FROM PhoneNumber WHERE (number = ?)), (SELECT id FROM Label WHERE 
(localized_label = ?))), 
…
(SELECT id FROM Label WHERE (localized_label = ?)))' returned 19 
(2067) errorMessage 'UNIQUE constraint failed: 
PhoneNumberIdentificationEntry.extension_id, 
PhoneNumberIdentificationEntry.phone_number_id, 
PhoneNumberIdentificationEntry.label_id'

Обычно я выбираю контакты с сервера и пытаюсь синхронизировать их - поэтому я сохраняю их локально с помощью Realm. Есть у кого идеи как справиться с такими ошибками?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Похоже, вы добавляете дубликаты контактов. Просто убедитесь, что добавляемые контакты уникальны.

0 голосов
/ 04 ноября 2019

Так как я не мог найти много решений ошибок CallKit Directory, я попытался исправить ошибки самостоятельно. Это заняло у меня некоторое время, и, чтобы сэкономить время для других разработчиков, я пытаюсь суммировать все ошибки, которые я получил во время реализации расширения каталога CallKit, с предложением решения для каждой из них - я не могу гарантировать, что эти решения работают на 100%, новозможно, они все еще могут помочь!

  • Ошибка sqlite3_step : Я часто получал ошибку, когда пытался снова синхронизировать контакты, поэтому я предполагаю, что ошибка какая-товид дублирующей ошибки. Поскольку у контакта может быть два номера, я использовал одно и то же имя для обеих записей, что в основном сработало, но я думаю, что в фоновом режиме все еще есть какая-то проблема идентификации, если вы используете точно такое же имя для метки. Поэтому я добавил индекс каждого контакта в конце метки, чтобы сохранить их уникальность, и теперь ошибка больше не появляется снова. (Даже если все ваши контакты имеют только один номер, имейте в виду, что возможно есть несколько контактов с одинаковыми именем и фамилией.)

  • com.apple.CallKit.error.calldirectorymanager error 2 : эта ошибка часто возникает из-за проблем с памятью. Расширение имеет гораздо меньше доступной памяти, чем само приложение (например, расширение CallKit Directory Extension имеет только 12 МБ). Чтобы предотвратить эту ошибку, я использовал механизм подкачки, который всегда загружает только определенное количество контактов в расширение, а затем перезагружается со следующей страницей. Если вы используете Realm, есть еще два аспекта, которые необходимо учитывать: во-первых, установите используемые типы объектов в конфигурации Realm Realm(configuration: Realm.Configuration(fileURL: realmFileURL, objectTypes: [ContactObject.self])) - это не позволит Realm вызывать objc_copyClassList(), который требует много памяти. Во-вторых, если вы фильтруете объекты области, которые конкретный предикат пытается избежать использования каких-либо ссылок в фильтре - например, во-первых, после добавления контакта в каталог CallKit я передал номер контакта в фильтробъекты области, чтобы пометить этот контакт как синхронизированный. Но затем я увидел, что память в расширении увеличивается с каждым синхронизированным контактом, поскольку, вероятно, существуют какие-то ссылки на контактный объект. Затем я выбрал одну и ту же страницу контактов, чтобы пометить их как синхронизированные, а не извлекать их по одному, что позволило мне загружать гораздо больше контактов на страницу. Подсказка: если вы хотите использовать точки останова в расширении или хотите отладить память расширения, перейдите в Xcode для отладки -> присоединить к процессу -> каталог вызовов AppName. Затем вы можете выбрать каталог вызовов в отладочном навигаторе и посмотреть объем используемой памяти. (Вы можете присоединиться к процессу расширения только тогда, когда он используется - на тот случай, если вы не можете увидеть его в списке)

  • com.apple.CallKit.error.calldirectorymanager error3 : контактные номера не упорядочены - закажите их перед добавлением в каталог.
  • com.apple.CallKit.error.calldirectorymanager error 4 : дублированные записи - убедитесь, чтодобавьте номер только один раз.

Пожалуйста, не стесняйтесь исправлять меня, если я ошибаюсь в любом из этих предложений, или добавлять дополнительные советы и решения - в противном случае я буду рад, если смогу помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...