2015-05-06 3 views
0

Существует множество приложений, выполняющих синхронизацию AddressBook со своими серверами Backend для проверки того, какие контакты в вашей адресной книге используют свое приложение и какие пользователи должны быть приглашены в их приложение.Синхронизировать адресную книгу iPhone с серверным сервером

Впервые он может выполнять полную синхронизацию, но после этого он не должен быть полной синхронизацией.

Мой первый вопрос: как лучше всего синхронизировать полную адресную книгу с сервером Backend?

Второй вопрос: как синхронизировать ТОЛЬКО контакты, которые изменились недавно?

Если есть образец приложения или учебник, пожалуйста, поделитесь со мной.

Заранее спасибо.

ответ

1

Здравствуйте, я также работаю над тем же понятием.

Прежде всего у меня нет учебника, чтобы поделиться с вами. Но то, что я делаю в приложении, я разделяю с вами весь поток.

Когда приложение запускается с первого раза, я получаю все контактные номера и отправляет на сервер.

Но когда какой-либо контакт изменяет, я отправляю только измененный номер контакта.

Вы получите обратный звонок из адресной книги при изменении контакта. Там будет конкретный идентификатор записи для каждого контакта

Swift

typealias ABExternalChangeCallback = CFunctionPointer < ((ABAddressBook !, CFDictionary, UnsafeMutablePointer) -> Пустота)>

Из этого свойства вы познаете когда ваш контакт был изменен в последнее время.

ABRecordCopyValue (запись, kABPersonModificationDateProperty) .takeRetainedValue() as? NSDate

Таким образом, в любом случае вы можете проверить номера телефонов, которые были изменены недавно, а затем просто отправить их на сервер.

Надеюсь, это может вам помочь !.

Благодаря

+0

#Anil Как мы знаем, измененный контакт, когда наше приложение не работает в заднем месте. – Rupesh

+0

@Rupesh: Я не думаю, что в любом случае вам нужно изменить контактную информацию, когда ваше приложение закрыто или не работает в фоновом режиме. Но если ваше приложение работает, вы получите обратный вызов для измененных контактных данных. –

0

Получить все телефонные номера из адресной книги, как отформатированная строка и отправить эту строку веб-сервер. это облегчает отправку всех контактов при небольшой задержке. на стороне веб-сервера вы можете кодировать, чтобы разделить номер телефона на отдельный номер и проверить для пользователя с тем же номером.

-(NSString *)getPhoneContactAsSingleString 
{ 
    NSString *numberString=[NSString new]; 
    [email protected]""; 

    CFErrorRef *error = nil; 
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); 
    __block BOOL accessGranted = NO; 

    if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 

    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
    accessGranted = granted; 
    dispatch_semaphore_signal(sema); 
    }); 
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

    } 
    else { // we're on iOS 5 or older 
    accessGranted = YES; 
    } 
    if (accessGranted) { 
    #ifdef DEBUG 
    //NSLog(@"Fetching contact"); 
    #endif 

    NSMutableArray *contacts=[[NSMutableArray alloc]init]; 
    NSMutableDictionary *numberNameDictionary=[[NSMutableDictionary alloc]init]; 
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); 
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); 
    CFIndex nPeople = CFArrayGetCount(allPeople); 
    for (int i = 0; i < nPeople; i++) 
    { 
     NSMutableDictionary *dictionary=[[NSMutableDictionary alloc]init]; 
     ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 

     if (person) { 

      NSString *firstname=[NSString new]; 
      NSString *lastname =[NSString new]; 

      CFStringRef firstnameStringRef=ABRecordCopyValue(person, kABPersonFirstNameProperty); 
      CFStringRef lastnameStringRef=ABRecordCopyValue(person, kABPersonLastNameProperty); 

      if (firstnameStringRef) { 
       firstname=[NSString stringWithFormat:@"%@",firstnameStringRef]; 
      } 
      if (lastnameStringRef) { 
       lastname =[NSString stringWithFormat:@"%@",lastnameStringRef]; 
      } 

      NSString *name=[NSString new]; 
      if (firstname.length!=0) 
      { 
       name=firstname; 
       if (lastname.length!=0) { 
        name=[name stringByAppendingString:@" "]; 
        name=[name stringByAppendingString:lastname]; 
       } 
      } 
      NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init]; 
      ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty); 
      for(CFIndex i=0;i<ABMultiValueGetCount(multiPhones);i++) { 

       CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i); 
       NSString *phoneNumber = (__bridge NSString *) phoneNumberRef; 
       NSString *braketStripedNum  = [phoneNumber stringByReplacingOccurrencesOfString:@"(" withString:@""]; 
       braketStripedNum    = [braketStripedNum stringByReplacingOccurrencesOfString:@")" withString:@""]; 
       phoneNumber=braketStripedNum; 

       NSString *dashStripedNum  = [self clean_phonenumber:phoneNumber with_string:@"-"]; 
       phoneNumber=dashStripedNum; 
       NSString *comaStripedNum  = [self clean_phonenumber:phoneNumber with_string:@","]; 
       phoneNumber=comaStripedNum; 
       NSString *dotStripedNum   = [self clean_phonenumber:phoneNumber with_string:@"."]; 
       phoneNumber=dotStripedNum; 
       NSString *spaceStripedNum  = [self clean_phonenumber:phoneNumber with_string:@" "]; 
       phoneNumber=spaceStripedNum; 

       if (phoneNumber.length>10) { 
        phoneNumber=[phoneNumber substringFromIndex:phoneNumber.length-10]; 
       } 



       if(phoneNumber.length!=0){ 
        [phoneNumbers addObject:phoneNumber]; 
        [numberNameDictionary setObject:name forKey:phoneNumber]; 
        //NSLog(@"[%@] --> [%@]",orginal_phonenumber,phoneNumber); 
        numberString=[NSString stringWithFormat:@"%@%@,",numberString,phoneNumber]; 
       } 

      } 

      //NSLog(@"%@",phoneNumbers); 
      if (phoneNumbers.count!=0) { 
       [dictionary setObject:name   forKey:@"name"]; 
       [dictionary setObject:phoneNumbers forKey:@"phonenumbers"]; 
       [contacts addObject:dictionary]; 

      } 
     } 
    } 
    if (numberString.length!=0) { 
     numberString=[numberString substringToIndex:[numberString length]-1]; 
    } 
} 
else 
{ 

#ifdef DEBUG 
    NSLog(@"Cannot fetch Contacts :("); 
#endif 

} 

return numberString; 
} 

Чистые номера телефонов

-(NSString *)clean_phonenumber:(NSString *)number with_string:(NSString *)string 
{ 
    NSArray *numberStrips   = [number componentsSeparatedByString:string]; 
    NSString *cleanNumber   = @""; 
    for (NSString *eachString in numberStrips) { 
     cleanNumber     = [NSString stringWithFormat:@"%@%@", cleanNumber, eachString]; 
    } 
    return cleanNumber; 
} 

Просто проверьте метод

NSLog(@"%@",[self getPhoneContactAsSingleString]);