如何解决CallKit目录扩展中的'sqlite3'和其他错误?

问题描述 投票:1回答:1

该应用程序的想法是将大约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一起保存在本地。有谁知道如何处理此类错误?

ios swift sqlite realm callkit
1个回答
0
投票

    sqlite3_step错误:当我尝试再次同步联系人时,经常会收到该错误,因此,我猜该错误是某种重复错误。由于联系人可能有两个号码,因此我对两个条目都使用了相同的名称,这基本起作用,但是我认为如果对标签使用完全相同的名称,则在后台仍然存在某种识别问题。因此,我在标签的末尾添加了每个联系人的索引,以使其保持唯一,现在该错误不再出现。 (即使您的所有联系人只有一个号码,也可能有些联系人的姓氏和名字都相同。)
  • com.apple.CallKit.error.calldirectorymanager错误2

  • :通常由于内存问题而出现此错误。扩展程序比应用程序本身具有更少的可用内存(例如,CallKit Directory Extensions仅具有12 MB可用空间)。为了防止出现此错误,我使用了一种分页机制,该机制始终仅将特定数量的联系人加载到扩展中,然后重新加载下一页。如果使用Realm,还需要考虑两个方面:首先,在Realm配置Realm(configuration: Realm.Configuration(fileURL: realmFileURL, objectTypes: [ContactObject.self]))中设置使用的对象类型-这可以防止Realm调用需要大量内存的objc_copyClassList()。其次,如果您过滤特定谓词要避免使用过滤器中任何种类的引用的领域对象-例如,首先,将联系人添加到CallKit目录后,我将联系人的编号传递给了领域对象以将该联系人标记为已同步。但是后来我看到扩展中的内存随着每个同步联系人的增加而增加,因为可能存在对联系人对象的某种引用。然后,我获取了与联系人完全相同的页面,以将所有联系人都标记为已同步,而不是一个接一个地获取它们,这使我每页可以加载更多的联系人。提示:如果要在扩展中使用断点或要调试扩展的内存,请在Xcode中进行调试->附加到进程-> AppName调用目录。然后,您可以在调试导航器中选择呼叫目录,并查看已使用的内存量。 (您只能在当前使用扩展程序时附加它-以防万一您在列表中看不到它)
  • com.apple.CallKit.error.calldirectorymanager错误3

  • :联系电话没有排序-请在将其添加到目录之前对其进行排序。
  • com.apple.CallKit.error.calldirectorymanager错误4
  • :重复的条目-确保仅添加一个号码。
    如果我对这些建议中的任何一个有误,请立即纠正我,或者添加其他提示和解决方案-否则,我很高兴能为您提供帮助!
© www.soinside.com 2019 - 2024. All rights reserved.