6

我正在开发一个现有的目标 c 项目,在阅读 iOS 的通讯簿 UI 框架参考时,我发现以下类在 iOS 9 中已弃用。( ABUnknownPersonViewController, ABPersonViewController, ABPeoplePickerNavigationController, ABNewPersonViewController) 这个 . 的替代品是什么?我在哪里可以找到一些与此相关的文件。任何帮助表示赞赏。提前致谢 。

4

2 回答 2

11

AddressBookUI框架已在 中弃用iOS 9,因此您最好使用ContactsUIFramework。

它具有许多新功能,包括AddressBookUI框架的所有功能。

因此,如果您的目标是iOS 9明确的,那么您应该选择ContactsUIFramework。

要检查AddressBookUI特定版本的框架是否可用,iOS您可以执行以下操作:

if ([CNContactStore class]) {
  CNContactStore *store = [CNContactStore new];
  //...
} else {
  // Fallback to old framework
}

这是完整的代码:

- (void) contactScan
{
    if ([CNContactStore class]) {
        //ios9 or later
        CNEntityType entityType = CNEntityTypeContacts;
        if( [CNContactStore authorizationStatusForEntityType:entityType] == CNAuthorizationStatusNotDetermined)
         {
             CNContactStore * contactStore = [[CNContactStore alloc] init];
             [contactStore requestAccessForEntityType:entityType completionHandler:^(BOOL granted, NSError * _Nullable error) {
                 if(granted){
                     [self getAllContact];
                 }
             }];
         }
        else if( [CNContactStore authorizationStatusForEntityType:entityType]== CNAuthorizationStatusAuthorized)
        {
            [self getAllContact];
        }
    }
}

-(void)getAllContact
{
    if([CNContactStore class])
    {
        //iOS 9 or later
        NSError* contactError;
        CNContactStore* addressBook = [[CNContactStore alloc]init];
        [addressBook containersMatchingPredicate:[CNContainer predicateForContainersWithIdentifiers: @[addressBook.defaultContainerIdentifier]] error:&contactError];
        NSArray * keysToFetch =@[CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey];
        CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:keysToFetch];
        BOOL success = [addressBook enumerateContactsWithFetchRequest:request error:&contactError usingBlock:^(CNContact * __nonnull contact, BOOL * __nonnull stop){
            [self parseContactWithContact:contact];
        }];
    }
}

- (void)parseContactWithContact :(CNContact* )contact
{
    NSString * firstName =  contact.givenName;
    NSString * lastName =  contact.familyName;
    NSString * phone = [[contact.phoneNumbers valueForKey:@"value"] valueForKey:@"digits"];
    NSStrubg * email = [contact.emailAddresses valueForKey:@"value"];
    NSArray * addrArr = [self parseAddressWithContac:contact];
}

- (NSMutableArray *)parseAddressWithContac: (CNContact *)contact
{
    NSMutableArray * addrArr = [[NSMutableArray alloc]init];
    CNPostalAddressFormatter * formatter = [[CNPostalAddressFormatter alloc]init];
    NSArray * addresses = (NSArray*)[contact.postalAddresses valueForKey:@"value"];
    if (addresses.count > 0) {
        for (CNPostalAddress* address in addresses) {
            [addrArr addObject:[formatter stringFromPostalAddress:address]];
        }
    }
    return addrArr;
}

只需确保您获得从设备读取联系人的权限即可。

参考链接:https ://gist.github.com/willthink/024f1394474e70904728

更新:

如需更换,AddressBookUI您需要使用CNContactPickerViewController. 您可以检查可用于一次拾取一个或多个联系人的委托方法。

这将呈现一个内置UIViewController的所有联系人,您需要实现它的委托方法!

选择一位联系人:

contactPicker:didSelectContact:

选择多个(新功能):

contactPicker:didSelectContacts:

CNContactPickerDelegate参考:https ://developer.apple.com/library/ios/documentation/ContactsUI/Reference/CNContactPickerDelegate_Protocol/

于 2016-01-29T07:15:49.160 回答
0

Apple 已经为 iOS9 及更高版本引入了新的框架,请在下面链接 链接

编辑:另一个链接:Link2

于 2016-01-29T07:14:00.257 回答