2016-01-29 7 views
5

Sto lavorando a un progetto obiettivo ogg esistente, Durante la lettura di Riferimento quadro UI rubrica indirizzi per iOS ho trovato che le classi sottostanti sono deprecate in iOS 9. (ABUnknownPersonViewController, ABPersonViewController, ABPeoplePickerNavigationController, ABNewPersonViewController) Qual è la sostituzione di questo? Dove posso trovare alcuni documenti correlati questo. ogni aiuto è apprezzato. Grazie in anticipo .Metodi obsoleti nella Rubrica Indirizzi interfaccia utente

risposta

9

Il quadro AddressBookUI è stato deprecato in iOS 9, quindi meglio che si dovrebbe utilizzare ContactsUI Quadro.

Ha molte nuove funzionalità incluse tutte le funzionalità del framework AddressBookUI.

Quindi, nel caso in cui se si targetizza lo iOS 9 in modo specifico, si consiglia di utilizzare il framework ContactsUI.

per controllare che AddressBookUI quadro è disponibile per la specifica iOS versione è possibile effettuare le seguenti operazioni:

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

Ecco il codice completo per questo:

- (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; 
} 

Basta fare in modo che si chiede la permesso di leggere i contatti dal dispositivo.

collegamento Riferimento: https://gist.github.com/willthink/024f1394474e70904728

Aggiornato:

Per la sostituzione per AddressBookUI è necessario utilizzare CNContactPickerViewController. È possibile controllare i metodi delegati che possono essere utilizzati per prelevare uno o più contatti alla volta.

Questo presenterà un integrato UIViewController con tutti i contatti e sarà necessario implementarne i metodi di delega!

Per selezionare un contatto:

contactPicker:didSelectContact: 

per selezionare più (nuove funzionalità):

contactPicker:didSelectContacts: 

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

+0

Suppongo che ContactsUI non sia disponibile per <9.0 versioni di iOS? Supponiamo che io abbia come target iOS 7 e versioni successive. Come pensi che dovrei affrontarlo? (Poiché ricevo avvisi deprecati per i metodi che utilizzano AddressBook Framework \ – NSNoob

+0

Sì, dovresti affrontare quel metodo usando il codice precedente 'if ([CNContactStore class]) { CNContactStore * store = [CNContactStore new]; // ... } { // Fallback al vecchio quadro } –

+1

Ma il ritorno al vecchio metodo manterrà ancora l'avvertimento deprecato nel mio progetto. Qual è l'incentivo del passaggio a ContactsUI allora? – NSNoob

0

Apple ha introdotto nuovo quadro di questo per iOS9 e soprattutto si prega di mettere sotto collegamento Link

Edit: un altro link: Link2

+1

Motivi e evitare risposte solo per collegamento. Per lo meno dovresti menzionare il nome del nuovo framework (in questo caso, 'ContactsUI') in modo che se i link si interrompono in futuro, qualcuno che legge la risposta può cercarlo almeno per nome. –

+0

quelli sono auto esplicativi .. –