2 daffodilgirl DaffodilGirl 于 2013.02.01 11:12 提问

在iphone4s地址薄中获取联系人
+(NSMutableArray *)getLastName
{

   ABAddressBookRef addressBook = ABAddressBookCreate();
    NSMutableArray *lastNameArray = [[NSMutableArray alloc]init];
    ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
    CFIndex numberOfContacts  = ABAddressBookGetPersonCount(addressBook);
    NSLog(@"%ld",numberOfContacts);
    CFArrayRef people = (__bridge CFArrayRef)((__bridge NSArray*)ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName));
    NSArray * tempArray = [[NSArray alloc]init];
    tempArray = (__bridge  NSArray *)(people);
    if ([tempArray count]>0) {
    for (int personIndex = 0; personIndex < [tempArray count]-1; personIndex++) {
        ABRecordRef person = (__bridge ABRecordRef)([tempArray objectAtIndex:personIndex]);
        ABMultiValueRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
        NSString *lastNameString = (__bridge NSString *)lastName;
        if (lastName!=nil)
            [lastNameArray addObject:lastNameString];
          }
    }
    return lastNameArray;
}

上面的代码在xcode6.0iphone3s中就可以正常运行,但是在4s和5中就不运行了。

3个回答

gaoXxxing
gaoXxxing   2013.02.01 13:53
已采纳

我觉得是IOS版本问题,在ios6.0中ABAddressBookCreate()不能用,只能在老版本中用,所以可以试试:

ABAddressBookRef addressBook;

if ([self isABAddressBookCreateWithOptionsAvailable])
{
    // iOS 6
    CFErrorRef error = nil;
    addressBook = ABAddressBookCreateWithOptions(NULL,&error);

    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
                                             {
                                             });
    ABAddressBookRevert(addressBook);
}
else
{
    // iOS 4/5
    addressBook = ABAddressBookCreate();
}



-(BOOL)isABAddressBookCreateWithOptionsAvailable
{
    return &ABAddressBookCreateWithOptions != NULL;
}
abcdeFGh_xyz
abcdeFGh_xyz   2013.02.01 13:39
-(void)_addContactToAddressBook
{
char *lastNameString, *firstNameString,*emailString;
NSMutableArray *arrname =[[NSMutableArray alloc] init];
NSMutableArray *arrTemp = [[NSMutableArray alloc] init];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
// AddressBook

ABAddressBookRef ab = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(ab);
CFIndex nPeople = ABAddressBookGetPersonCount(ab);

for(int i = 0; i < nPeople; i++)
{   
    [dict removeAllObjects];
    ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);

    CFStringRef firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
    CFStringRef lastName = ABRecordCopyValue(ref, kABPersonLastNameProperty);
    ABMutableMultiValueRef multi = ABRecordCopyValue(ref, kABPersonEmailProperty);
    CFStringRef email;
    if (ABMultiValueGetCount(multi) > 0) {
        // collect all emails in array
        for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) 
        {
            CFStringRef emailRef = ABMultiValueCopyValueAtIndex(multi, i);
            //[personDealingWithEmails addObject:(NSString *)emailRef];
            email=emailRef;
            CFRelease(emailRef);
        }
    }
    else
    {
        email=nil;
    }

    CFDataRef imgData;
    if(ABPersonHasImageData(ref))
    {
        imgData = ABPersonCopyImageData(ref);
    }else {
        imgData=nil;
    }

    static char* fallback = "";
    int fbLength = strlen(fallback);

    int firstNameLength = fbLength;
    bool firstNameFallback = true;

    int lastNameLength = fbLength;
    bool lastNameFallback = true;

    int emailLength = fbLength;
    bool emailFallback = true;

    if (firstName != NULL)
    {
        firstNameLength = (int) CFStringGetLength(firstName);
        firstNameFallback = false;
    }
    if (lastName != NULL)
    {
        lastNameLength = (int) CFStringGetLength(lastName);
        lastNameFallback = false;
    }
    if (email !=  NULL)
    {
        emailLength = (int) CFStringGetLength(email);
        emailFallback = false;
    }


    if (firstNameLength == 0)
    {
        firstNameLength = fbLength;
        firstNameFallback = true;
    }
    if (lastNameLength == 0)
    {
        lastNameLength = fbLength;
        lastNameFallback = true;
    }
    if (emailLength == 0)
    {
        emailLength = fbLength;
        emailFallback = true;
    }


    firstNameString = malloc(sizeof(char)*(firstNameLength+1));
    lastNameString = malloc(sizeof(char)*(lastNameLength+1));
    emailString = malloc(sizeof(char)*(emailLength+1));

    if (firstNameFallback == true)
    {
        strcpy(firstNameString, fallback);
    }
    else
    {
        CFStringGetCString(firstName, firstNameString, 10*CFStringGetLength(firstName), kCFStringEncodingASCII);
    }

    if (lastNameFallback == true)
    {
        strcpy(lastNameString, fallback);
    }
    else
    {
        CFStringGetCString(lastName, lastNameString, 10*CFStringGetLength(lastName), kCFStringEncodingASCII);
    }

    if (emailFallback == true)
    {
        strcpy(emailString, fallback);
    }
    else
    {
        CFStringGetCString(email, emailString, 10*CFStringGetLength(email), kCFStringEncodingASCII);
    }

    printf("%d.\t%s %s\n", i, firstNameString, lastNameString);
    NSString *fname= [NSString stringWithFormat:@"%s",firstNameString];
    NSString *lname= [NSString stringWithFormat:@"%s",lastNameString];
    NSString *fullName=[NSString stringWithFormat:@"%@%@%@",fname,([fname length]!=0)?@" ":@"",lname];
    NSString *eMail= [NSString stringWithFormat:@"%s",emailString];
    NSData *myData;
    if (imgData) {
        myData=(__bridge NSData *)imgData;
    }else {
        myData=nil;
    }


    //fetch Phone num
    ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(ref, kABPersonPhoneProperty);
    NSArray* phoneNumbers = (__bridge NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty);
    CFRelease(phoneNumberProperty);

    // Do whatever you want with the phone numbers
    //NSLog(@"Phone numbers = %@", phoneNumbers);
    NSString *PhoneNum = [phoneNumbers objectAtIndex:0];


    //--------------remove special char form string(Phone number)-----------------      
    NSString *originalString = PhoneNum;

    //NSLog(@"%@", originalString);
    NSMutableString *strippedString = [NSMutableString 
                                       stringWithCapacity:originalString.length];

    NSScanner *scanner = [NSScanner scannerWithString:originalString];
    NSCharacterSet *numbers = [NSCharacterSet 
                               characterSetWithCharactersInString:@"0123456789"];

    while ([scanner isAtEnd] == NO) {
        NSString *buffer;
        if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
            [strippedString appendString:buffer];

        } else {
            [scanner setScanLocation:([scanner scanLocation] + 1)];
        }
    }

    if([fname isEqualToString:@""] && [lname isEqualToString:@""]){

    }else{

        if (myData) {
            UIImage *img = [UIImage imageWithData:myData];

            [dict setObject:img forKey:@"imgData"];         
        }

        [dict setValue:fname forKey:@"fname"];
        [dict setValue:lname forKey:@"lname"];
        [dict setValue:fullName forKey:@"fullName"];
        [dict setValue:eMail forKey:@"email"];
        [dict setValue:strippedString forKey:@"phoneNumber"];
        [dict setValue:@"addressbook" forKey:@"type"];
        [arrname addObject:[dict copy]];
    }

    if (firstName != NULL)
    {
        CFRelease(firstName);
    }
    if (imgData != NULL)
    {
        CFRelease(imgData);
    }
    if (lastName != NULL)
    {
        CFRelease(lastName);
    }
    if (email != NULL)
    {
        CFRelease(email);
    }
    free(firstNameString);
    free(lastNameString);
    free(emailString);
}


for (int i=0; i<[arrname count]; i++) 
{
    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
    [dict setValue:@"0" forKey:@"sel"];
    [arrTemp addObject:dict];
}

[arrallcontacts addObjectsFromArray:arrname];

[arraddedcontactsfulllist addObjectsFromArray:arrallcontacts];
NSSortDescriptor *sortByfullName = [[NSSortDescriptor alloc] initWithKey:@"fullName" ascending:YES];
NSArray *descriptors = [NSArray arrayWithObject:sortByfullName];
NSArray *sorted = [arraddedcontactsfulllist sortedArrayUsingDescriptors:descriptors];
[arraddedcontactsfulllist removeAllObjects];
[arraddedcontactsfulllist addObjectsFromArray:sorted];
[arraddedcontacts removeAllObjects];
[arraddedcontacts addObjectsFromArray:sorted];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
tblview.alpha=1;
[UIView commitAnimations];
[tblview reloadData];

if (![[[[NSUserDefaults standardUserDefaults] objectForKey:@"USER_DETAIL"] objectForKey:@"facebook"] isEqualToString:@"Unauthenticate"]) {

    [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
    [self performSelector:@selector(getfacebookfriends) withObject:nil afterDelay:0.0001];
}
}
-(void)fetchIphoneContact
{
if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0)
{
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
        ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
            // First time access has been granted, add the contact
            [self _addContactToAddressBook];
            [tblview reloadData];
        });
    }
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
        // The user has previously given access, add the contact
        [self _addContactToAddressBook];
        [tblview reloadData];
    }
    else {
        // The user has previously denied access
        // Send an alert telling user to change privacy setting in settings app
        DisplayAlertWithTitle(APP_Name, @"You can change your privacy setting in settings app");
    }

}
else
{
    [self _addContactToAddressBook];
}
}

此方法可以运行在ios6及以下版本

qabcq
qabcq   2015.10.13 17:29

oohhhhhhhhhhhhhhhhhhhhhhhhhhhhh

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!