2016-01-29 15 views
5

Pracuję nad istniejącym celem projektu c, Podczas czytania książki adresowej UI odniesienia do systemu dla iOS znalazłem poniższe klasy mają przestarzałe w iOS 9. (ABUnknownPersonViewController, ABPersonViewController, ABPeoplePickerNavigationController, ABNewPersonViewController) Co to jest zastępstwo? Gdzie mogę znaleźć jakiś dokument na ten temat. każda pomoc doceniona. Z góry dziękuję .Książka adresowa UI Framework przestarzałe metody

Odpowiedz

9

Ramy AddressBookUI została zaniechana w iOS 9, więc lepiej należy użyć ContactsUI Framework.

Posiada wiele nowych funkcji, w tym wszystkie funkcje architektury AddressBookUI.

Tak więc, w przypadku, gdy celujesz konkretnie w iOS 9, powinieneś wybrać się na ContactsUI Framework.

Aby sprawdzić, AddressBookUI ramy jest dostępna dla konkretnego iOS wersji można wykonać następujące czynności:

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

Oto pełna kodują że:

- (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 [email protected][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; 
} 

Wystarczy upewnić się, że zapytać pozwolenie na odczyt kontaktów z urządzenia.

LINK: https://gist.github.com/willthink/024f1394474e70904728

Aktualizacja:

Przy wymianie na AddressBookUI trzeba użyć CNContactPickerViewController. Możesz sprawdzić metody delegatów, które można wykorzystać do pobrania jednego lub wielu kontaktów naraz.

To będzie prezentować wbudowany UIViewController ze wszystkimi kontaktami i musisz zaimplementować metody delegatów!

Aby wybrać jeden kontakt:

contactPicker:didSelectContact: 

Aby zaznaczyć kilka (New Feature):

contactPicker:didSelectContacts: 

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

+0

Zakładam, że ContactsUI nie będzie dostępne dla wersji <9.0 iOS? Załóżmy, że kieruję reklamy na system iOS 7 lub nowszy. Jak myślisz, jak powinienem się z tym zmierzyć? (Ponieważ otrzymuję przestarzałe ostrzeżenie o metodach korzystających z programu AddressBook Framework \ – NSNoob

+0

Tak, powinieneś zająć się tą metodą, używając powyższego kodu 'if ([CNContactStore class]) { CNContactStore * store = [CNContactStore new]; // ... } else { // Fallback to old framework } ' –

+1

Ale powrót do starej metody nadal będzie zawierał przestarzałe ostrzeżenie w moim projekcie.Jaką motywacją jest przejście do ContactsUI? – NSNoob

0

Apple wprowadziła nowe ramy dla tego dla iOS9 i powyżej proszę precyzyjnie poniżej linku Link

Edit: jedno ogniwo: Link2

+1

Podniesione e unikaj odpowiedzi tylko na link. Przynajmniej powinieneś wymienić nazwę nowego frameworka (w tym przypadku 'ContactsUI'), aby po zerwaniu odnośników w przyszłości ktoś czytający odpowiedź mógł przynajmniej wyszukać go po nazwie. –

+0

te są oczywiste .. –

Powiązane problemy