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
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/
Apple ha introdotto nuovo quadro di questo per iOS9 e soprattutto si prega di mettere sotto collegamento Link
Edit: un altro link: Link2
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. –
quelli sono auto esplicativi .. –
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
Sì, dovresti affrontare quel metodo usando il codice precedente 'if ([CNContactStore class]) { CNContactStore * store = [CNContactStore new]; // ... } { // Fallback al vecchio quadro } –
Ma il ritorno al vecchio metodo manterrà ancora l'avvertimento deprecato nel mio progetto. Qual è l'incentivo del passaggio a ContactsUI allora? – NSNoob