【问题标题】:How to get RecordID from CNContactStore ios如何从 CNContactStore ios 获取 RecordID
【发布时间】:2016-11-14 09:39:50
【问题描述】:

这是我获取设备联系人并保存到MutableArray的代码。

但我需要为所有联系人单独获取recordID,并将其保存到同一个数组中以供进一步使用。 (例如,使用recordId 删除联系人)。

请帮帮我,我被困了 4 天。

[contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact* __nonnull contact, BOOL* __nonnull stop){
           if( contact.phoneNumbers)
                phoneNumber = [[[contact.phoneNumbers firstObject] value]];
           if( contact.emailAddresses)
                emailAddress = [[contact.emailAddresses firstObject] value];
           contactValue=[[NSMutableDictionary alloc] init];               
                [contactValue setValue:phoneNumber ?:@"" forKey:@"phoneNumber"];
                [contactValue setValue:emailAddress ?:@"" forKey:@"emailAddress"];
                [contactValue setObject:contact.identifier forKey:@"phoneIdentifier"];
                [contactValue setObject:contact.givenName ?:@"" forKey:@"firstName"];
                [contactValue setObject:contact.familyName ?:@"" forKey:@"lastName"];

           [_totalContact addObject:contactValue];
      }]

【问题讨论】:

  • 你卡在哪里了?你不能做什么? “保存到同一个数组中以供进一步使用”是什么意思?
  • 我想删除选定的联系人。你知道如何删除选中的联系人吗?
  • 看看下面我的回答。我自己验证了这段代码,它运行良好。

标签: ios objective-c iphone cncontact cncontactstore


【解决方案1】:

从您的问题陈述中,我了解到您希望根据该联系人identifier 联系簿中的delete 联系人。当您拥有identifier 时,您需要做的就是:

- (void)deleteContactWithIdentifier:(NSString *)identifier {

    NSArray *keys = @[CNContactGivenNameKey,
                      CNContactPhoneNumbersKey,
                      CNContactEmailAddressesKey,
                      CNContactIdentifierKey];
    CNMutableContact *contact = [[store unifiedContactWithIdentifier:identifier keysToFetch:keys error:nil] mutableCopy];
    NSError *error;
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest deleteContact:contact];
    [store executeSaveRequest:saveRequest error:&error];
}

【讨论】:

  • 感谢 Adeel 的完美工作。你能如何合并重复的联系人?
  • 当然@InderpalSingh。我建议您为此提出一个新问题,因为它会在这篇文章中脱离主题。您可以在评论中添加新问题的链接。
  • 这里是链接@Adeel link
【解决方案2】:

如果您真的需要阅读 recordID(旧 API),请使用这个简单的扩展。

recordID 始终获取。

此代码永远不会提交到 App Store。它使用私有 API!

CNContact+PrivateExtension.h

NS_ASSUME_NONNULL_BEGIN

@interface CNContact (PrivateExtension)

@property (readonly) NSNumber *privateRecordID;

@end

NS_ASSUME_NONNULL_END

CNContact+PrivateExtension.m

@implementation CNContact (PrivateExtension)

- (NSNumber *)privateRecordID
{
    return [self valueForKey:@"recordID"];
}

@end

【讨论】:

  • 你在 iOS 11 beta 上使用过这个吗?在 iOS 11 上的 CNContact 对象上使用 valueForKey:@"recordID" 崩溃并给出消息“这个类不是键值编码兼容的键记录 ID。”好像 Apple 放弃了对 ABAddressBook 属性的支持
猜你喜欢
  • 2019-12-10
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多