Проблема при получении адреса, фотографии из адресной книги iphone

У меня есть задача разработать приложение с разрывом телефона. И получить в моем приложении с помощью javascript.

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

Я сделал весь код, чтобы получить контакт в собственном коде. и я отправляю его в файл javascript, создавая объект jsstring функции javascript.

Это мой родной инструмент для чтения данных адресной книги.

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)picker
 shouldContinueAfterSelectingPerson:(ABRecordRef)person
{

    /** Fetch Contact name */
    name = (NSString *)ABRecordCopyCompositeName(person);

    NSLog(@"name:%@",name);

    /** Fetch Mobile number  */
    ABMultiValueRef *phones = (ABMultiValueRef *) ABRecordCopyValue(person, kABPersonPhoneProperty);
    mobile=[[NSString alloc] initWithString:@""];
    NSString *mobileLabel = [[NSString alloc] initWithString:@""];
    for (CFIndex i=0; i < ABMultiValueGetCount(phones); i++) {
        mobileLabel = (NSString *) ABMultiValueCopyLabelAtIndex(phones, i);
        if ([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) {
            mobile = (NSString *)ABMultiValueCopyValueAtIndex(phones, i);
        }
        else if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneIPhoneLabel]) {
            mobile = (NSString *)ABMultiValueCopyValueAtIndex(phones, i);
        }
    }

    /** Fetch Email addres */
    emailID =  [NSString stringWithFormat:@""];
    ABMultiValueRef emails = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonEmailProperty);
    for (CFIndex i=0; i < ABMultiValueGetCount(emails); i++) {

        [emailID release];
        emailID = (NSString *)ABMultiValueCopyValueAtIndex(emails, 0);  
        NSLog(@"emailid:%@",emailID);
    }


    /** Fetch Homepage */
    ABMultiValueRef homepage = (ABMultiValueRef *) ABRecordCopyValue(person, kABPersonURLProperty);
    NSString *homepageLabel =  [NSString stringWithFormat:@""];
    homepageID =  [NSString stringWithFormat:@""];
    for(CFIndex i=0; i < ABMultiValueGetCount(homepage);i++)
    {
        homepageLabel = (NSString *) ABMultiValueCopyLabelAtIndex(homepage, i);
        if([homepageLabel isEqualToString:(NSString *)kABPersonHomePageLabel]){
            homepageID = (NSString *)ABMultiValueCopyValueAtIndex(homepage, i);
            NSLog(@"homepage:%@",homepageID);
        }
    }

    /** Fatch Image */
    NSData  *imgData = (NSData *)ABPersonCopyImageData(person);

    // call the js to fill the all contact infromation
    {
        NSString* jsString = [[NSString alloc] initWithFormat:@"fillContactInfo('%@','%@','%@','%@','%@');",name ,mobile ,emailID, homepageID, imgData];
        NSLog(@"jstring:%@",jsString);

        [webView stringByEvaluatingJavaScriptFromString:jsString];
        [jsString release];
    }

    [emailID release];
    [mobile release];
    [mobileLabel release];
    [homepageID release];
    [homepageLabel release];
    return YES;
}


- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)picker shouldContinueAfterSelectingPerson:(ABRecordRef)person
                        property:(ABPropertyID)property
        identifier:(ABMultiValueIdentifier)identifier{

            /*
            * Set up an ABMultiValue to hold the address values; copy from address
            * book record.
            */
            ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonAddressProperty);
            // Set up an NSArray and copy the values in.
            NSArray *theArray = [(id)ABMultiValueCopyArrayOfAllValues(multi) autorelease];
            // Figure out which values we want and store the index.
            const NSUInteger theIndex = ABMultiValueGetIndexForIdentifier(multi, identifier);
            // Set up an NSDictionary to hold the contents of the array.
            NSDictionary *theDict = [theArray objectAtIndex:theIndex];
            // Set up NSStrings to hold keys and values.  First, how many are there?
            const NSUInteger theCount = [theDict count];
            NSString *keys[theCount];
            NSString *values[theCount];
            // Get the keys and values from the CFDictionary.  Note that because
            // we're using the "GetKeysAndValues" function, you don't need to
            // release keys or values.  It's the "Get Rule" and only applies to
            // CoreFoundation objects.
            [theDict getObjects:values andKeys:keys];
            // Set the address label's text.

            addressid = [NSString stringWithFormat:@"%@, %@",
                [theDict objectForKey:(NSString *)kABPersonAddressStreetKey],
                [theDict objectForKey:(NSString *)kABPersonAddressCityKey]];


    // call the js to fill the all contact infromation
    {
        NSString* jsString = [[NSString alloc] initWithFormat:@"fillContactAddress('%@');",addressid];

        NSLog(@"jscript:%@",jsString);

        [webView stringByEvaluatingJavaScriptFromString:jsString];
        [jsString release];
    }

    [[self appViewController] dismissModalViewControllerAnimated:YES];

        // If they didn't pick an address, return YES here to keep going.
        return NO;


}

На этом этапе я получаю имя, адрес, номер телефона, адрес электронной почты, домашнюю страницу, фотографию в консоли NSLog при запуске приложения. Ниже приведена моя функция javascript для их извлечения:

function fillContactInfo(name,mobile,email,homepage,imgData){

    mobile = mobile.replace(" ", "").replace("(", "").replace(")", "").replace("-", "").replace("+", "").replace("-", "").replace("-", "");

    user.contactname = name;
    user.contactemail = email;
    user.contactphone = mobile;
    user.contactimage = imgData;
    user.contacturl = homepage;

    document.getElementById("contactname").value = user.contactname;        
    document.getElementById("contactemail").value = user.contactemail;
    document.getElementById("contactphone").value = user.contactphone;
    document.getElementById("contactimage").src = "data:image/png;base64,user.contactimage";
    document.getElementById("contacturl").value = user.contacturl;

}


function fillContactAddress(address){

    user.address = address;

    document.getElementById("contactaddress").value = user.contactaddress;

}

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

Я также должен попытаться поместить имя, номер телефона, адрес электронной почты и домашнюю страницу в

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)picker shouldContinueAfterSelectingPerson:(ABRecordRef)person
                            property:(ABPropertyID)property
            identifier:(ABMultiValueIdentifier)identifier

class, но это не дает мне результата.

И у меня есть тег изображения html для отображения изображения списка контактов.


person Hrushikesh Betai    schedule 15.07.2011    source источник


Ответы (1)


Содержимое address внутри ABMultiValue - это структура NSDictionary. Вы можете использовать следующие ключи для получения желаемых значений. Подробная информация находится в этот официальный документ.

  • const CFStringRef kABPersonAddressStreetKey;
  • const CFStringRef kABPersonAddressCityKey;
  • const CFStringRef kABPersonAddressStateKey;
  • const CFStringRef kABPersonAddressZIPKey;
  • const CFStringRef kABPersonAddressCountryKey;
  • const CFStringRef kABPersonAddressCountryCodeKey;

Что касается данных изображения, я не могу получить четкое представление о том, как они будут обрабатываться в javascript. Возможно, вам нужно передать эти двоичные данные способом base64.

Редактировать:

Пример адреса:

  ABMultiValueRef aMulti = ABRecordCopyValue(srcRecord, kABPersonAddressProperty);
  if (aMulti != nil) {
     int aMultiCount = ABMultiValueGetCount(aMulti);
     for (int i = 0; i < aMultiCount; ++i) {
         NSDictionary *abDict = (NSDictionary *)ABMultiValueCopyValueAtIndex(aMulti, i); 

         NSString *street = [abDict objectForKey:(NSString *)kABPersonAddressStreetKey];
         NSString *city = [abDict objectForKey:(NSString *)kABPersonAddressCityKey];

         // obtains other properties ....

         [abDict release];
     }
     CFRelease(aMulti);
  }
person AechoLiu    schedule 15.07.2011
comment
Не могли бы вы объяснить с помощью образца. как получить адрес. я могу правильно понять ваш ответ. - person Hrushikesh Betai; 15.07.2011
comment
Спасибо за ответ. но в настоящее время у меня также есть одна проблема с получением изображения. Я уже преобразовал изображение в данные, и в java-скрипте я получаю эти данные, но когда я конвертирую его с помощью bse64 png, он не дает мне изображения. так что, пожалуйста, помогите мне и предоставьте мне образец, если это возможно. - person Hrushikesh Betai; 20.07.2011
comment
Мне жаль. Я не знаю, как java-скрипт обрабатывает изображение. Но когда я преобразую данные изображения в форматы vcf или XML, они хорошо работают, передавая двоичные данные в строки base64. - person AechoLiu; 26.07.2011