【发布时间】:2017-05-13 18:57:01
【问题描述】:
我的 iOS 应用程序会不时检查联系人并将新联系人导入自己的数据库。
我通过identifier 字段检查联系人是否已经存在,该字段通常由 UUID 填充:
CNContactStore *store = [CNContactStore new];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error) {
if (granted) {
NSArray *keys = @[CNContactNamePrefixKey,
CNContactGivenNameKey,
CNContactMiddleNameKey,
CNContactFamilyNameKey,
CNContactInstantMessageAddressesKey];
NSString *containerId = store.defaultContainerIdentifier;
NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];
NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&err];
for (CNContact *contact in cnContacts) {
...
NSString *contactId = [contact identifier];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"uuid == %@", contactId]];
...
}
有时除了 UUID 之外的标识符包含:ABPerson 字符串(例如9326A125-3C0A-494F-9E50-BBFCF1140EF0:ABPerson),并且这样的联系人只出现一次。下一次出现相同的联系人,但使用另一个 UUID 并且没有 :ABPerson。
所以,我的联系人导入器认为他们是 2 个不同的联系人并保存了 2 次。
CNContact 标识符中的:ABPerson 字符串是什么?
我知道AddressBook framework 和ABPerson 类,但我使用Contacts 框架来处理设备联系人,为什么:ABPerson 出现在这里?
我可以只过滤或检查标识符中的此字符串以防止联系人重复吗?CNContact 标识符中是否可能包含其他字符串?
【问题讨论】:
-
你是否使用 enumeratecontactswithfetchrequest 来获取联系人?
-
不,我正在使用
unifiedContactsMatchingPredicate:predicate:方法。我更新了我的代码,所以你可以看看这个。 -
如果您在地址簿中使用 Google 帐户,则在保存到地址簿后,谷歌会将联系人标识符更改为不带“:APBerson”的自我标识符。在第一刻,它只是删除:ABPerson,但在重新启动后,它会将联系人标识符更改为另一个 GUID。在其他联系人提供者上,它可能是改变卡片标识符的其他规则,所以最好不要使用联系人标识符。
-
@suresh-durishetti,我使用他们的电话号码管理联系人,他们也有
UUID,并且不像联系人不会在应用程序会话之间更改它们 -
你找到这个问题的答案了吗?
标签: ios objective-c cncontact