该应用程序的想法是将大约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一起保存在本地。有谁知道如何处理此类错误?
com.apple.CallKit.error.calldirectorymanager错误2
Realm(configuration: Realm.Configuration(fileURL: realmFileURL, objectTypes: [ContactObject.self]))
中设置使用的对象类型-这可以防止Realm调用需要大量内存的objc_copyClassList()
。其次,如果您过滤特定谓词要避免使用过滤器中任何种类的引用的领域对象-例如,首先,将联系人添加到CallKit目录后,我将联系人的编号传递给了领域对象以将该联系人标记为已同步。但是后来我看到扩展中的内存随着每个同步联系人的增加而增加,因为可能存在对联系人对象的某种引用。然后,我获取了与联系人完全相同的页面,以将所有联系人都标记为已同步,而不是一个接一个地获取它们,这使我每页可以加载更多的联系人。提示:如果要在扩展中使用断点或要调试扩展的内存,请在Xcode中进行调试->附加到进程-> AppName调用目录。然后,您可以在调试导航器中选择呼叫目录,并查看已使用的内存量。 (您只能在当前使用扩展程序时附加它-以防万一您在列表中看不到它)com.apple.CallKit.error.calldirectorymanager错误3