Retrieving instant message information from an ABRecordRef - iphone

I'm trying to get the instant message account information from existing AddressBook contacts on iOS. I walk through the contacts and I get the contacts which have an instant messaging value, but I can't read the jabber-address.
abArray = (NSArray *)ABAddressBookCopyArrayOfAllPeople(ABAddressBookCreate());
for(int i=0 ; i<[abArray count];i++)
{
ABRecordRef record = [abArray objectAtIndex:i];
ABMutableMultiValueRef multi = ABRecordCopyValue(record, kABPersonInstantMessageProperty);
for(CFIndex x=0;x<ABMultiValueGetCount(multi);x++)
{
CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(multi, x);
CFStringRef jabber = CFDictionaryGetValue(dict, kABPersonInstantMessageServiceJabber);
if(CFDictionaryContainsKey(dict, kABPersonInstantMessageServiceJabber))
{
NSLog(#"yes");
}
else {
NSLog(#"no");
}
// only to make it possible to log to console
NSString *jaab = (NSString *)jabber;
NSLog(#"jabber adress: %#" , jaab);
}
CFRelease(dict);
}
}
What am I doing wrong?

for(int i=0 ; i<[abArray count];i++)
{
ABRecordRef record = [abArray objectAtIndex:i];
ABMutableMultiValueRef multi = ABRecordCopyValue(record, kABPersonInstantMessageProperty);
for(CFIndex x=0;x<ABMultiValueGetCount(multi);x++)
{
CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(multi, x);
CFStringRef jabber;
//Use this piece of code to print the dict to log and check
NSDictionary *nsdict = (NSDictionary *)dict;
NSString *jabberID = [NSString stringWithString:#""];
NSLog(#"Dict: %#", nsdict);
if([[nsdict valueForKey:#"service"] isEqualToString:#"Jabber"]){
jabberID = [nsdict valueForKey:#"username"];
}
//Code to print dict to log ends here. Comment the whole piece if not needed.
if(CFStringCompare((CFStringRef)#"jabber", CFDictionaryGetValue(dict, #"service"), 0))
{
NSLog(#"yes");
jabber = CFDictionaryGetValue(dict, #"username");
// only to make it possible to log to console
NSString *jaab = (NSString *)jabber;
NSLog(#"jabber adress: %#" , jaab);
}
else {
NSLog(#"no");
}
}
//CFRelease(dict);
}

Related

Allow App to use contacts pop up not appearing ios7

I am using an application where i want to fetch contacts.The problem is that the app only asks for the first time that app would like to use contacts.Even if i delete the application,clean it and run again,the application is not asking the pop up next time it runs.I debugged the code and found that the permission i gave for the first time is executed.how to solve this.Below is the code i wrote in view did load.
CFErrorRef *error=nil;
ABAddressBookRef addressbook=ABAddressBookCreateWithOptions(NULL, error);
CFArrayRef allpeople=ABAddressBookCopyArrayOfAllPeople(addressbook);
CFIndex npeople=ABAddressBookGetPersonCount( addressbook );
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
if (granted) {
for ( int i = 0; i < npeople; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex( allpeople, i );
NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(ref, kABPersonFirstNameProperty));
NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(ref, kABPersonLastNameProperty));
NSLog(#"Name:%# %#", firstName, lastName); }
// First time access has been granted, add the contact
} else {
// User denied access
// Display an alert telling user the contact could not be added
}
});
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
for ( int i = 0; i < npeople; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex( allpeople, i );
NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(ref, kABPersonFirstNameProperty));
NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(ref, kABPersonLastNameProperty));
NSLog(#"Name:%# %#", firstName, lastName); }
// The user has previously given access, add the contact
}
else {
for ( int i = 0; i < npeople; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex( allpeople, i );
NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(ref, kABPersonFirstNameProperty));
NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(ref, kABPersonLastNameProperty));
NSLog(#"Name:%# %#", firstName, lastName); }
// The user has previously denied access
// Send an alert telling user to change privacy setting in settings app
}
Follow the following procedure
Go to Device's Setting->General->Reset->Reset Location & Privacy.
Then it should ask you for permission.

fetching only mobile section record (not from iphone, home label etc) from addressbook?

How do I fetch only mobile section record from addressbook in ios?
I want to add only one record to my array that is fetched from mobile section record.
How do I do that. I am getting all the phone property records. but I need to get only mobile section record.
NSArray *allPeople = (NSArray *)ABAddressBookCopyArrayOfAllPeople(myAddressBook);
NSLog(#"allpeople%#", allPeople);
for (id record in allPeople) {
CFTypeRef phoneProperty = ABRecordCopyValue((ABRecordRef)record, kABPersonPhoneProperty);
NSArray *phones = (NSArray *)ABMultiValueCopyArrayOfAllValues(phoneProperty);
NSLog(#"phones %#",phones);
CFRelease(phoneProperty);
NSMutableDictionary *newRecord = [[NSMutableDictionary alloc] init];
NSMutableString *newPhone = [[NSMutableString alloc] init];
for (NSString *phone in phones) {
if(![newPhone isEqualToString:#""])
[newPhone appendString:#", "];
[newPhone appendString:phone];
}
You can try something like this..
ABMultiValueRef phoneNumbers = ABRecordCopyValue(abPerson, kABPersonPhoneProperty);
if (phoneNumbers) {
CFIndex numberOfPhoneNumbers = ABMultiValueGetCount(phoneNumbers);
for (CFIndex i = 0; i < numberOfPhoneNumbers; i++) {
NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers, i);
CFStringRef label = ABMultiValueCopyLabelAtIndex(phoneNumbers, i);
if (label) {
if (CFEqual(label, kABPersonPhoneMobileLabel)) {
primaryPhoneText.text = phone;
} else {
}
CFRelease(label);
[allPhones addObject:phone]; // allPhones is an array here.
}
}
CFRelease(phoneNumbers);
}
Hope this will help you out..
Enjoy coding..

Detect what was changed from ABAddressBookRegisterExternalChangeCallback

I am using ABAddressBookRegisterExternalChangeCallback to get the external changes in AddressbookBook of the user. I am using the following code to register the callback:
ABAddressBookRef ntificationaddressbook = ABAddressBookCreate();
ABAddressBookRegisterExternalChangeCallback(ntificationaddressbook, MyAddressBookExternalChangeCallback, self);
and when this callback is called then MyAddressBookExternalChangeCallback is called successfully
void MyAddressBookExternalChangeCallback (ABAddressBookRef ntificationaddressbook,CFDictionaryRef info,void *context)
{
NSLog(#"Changed Detected......");
}
I have the following questions:
How can i detect which contacts was changed, and which action (ADD,Update,Delete) was performed on that Contact. I need to get the recordID of that contact. Is it Possible ?
Unfortunately if thats not possible then how the apps like viber, tango, watsapp gets the change information ?
I gets the callback method called only when the app is in background if the app is terminated is there any way to get the changes notification.
Please help. Thanks in advance.
I found the solution to find what was changed in the addressbook. I am not sure if its a precise one, But some how that works.
Create a Callback Notification for Addressbook:-
ABAddressBookRef ntificationaddressbook = ABAddressBookCreate();
ABAddressBookRegisterExternalChangeCallback(ntificationaddressbook, MyAddressBookExternalChangeCallback, self);
Than Add the following code when notification Occurs:-
void MyAddressBookExternalChangeCallback (ABAddressBookRef ntificationaddressbook,CFDictionaryRef info,void *context)
{
NSTimeInterval timeStampone = [[NSDate date] timeIntervalSince1970];
NSNumber *timeStamponeobj= [NSNumber numberWithDouble: timeStampone];
NSLog(#"Start Process");
NSUserDefaults *userdefs = [[NSUserDefaults alloc]init];
NSMutableArray *arraytemp = [[NSMutableArray alloc]init];
CFArrayRef peopleRefs = ABAddressBookCopyArrayOfAllPeopleInSource(ntificationaddressbook, kABSourceTypeLocal);
NSMutableArray *changedrecords = [[NSMutableArray alloc]init];
ABAddressBookRevert(ntificationaddressbook);
CFIndex count = CFArrayGetCount(peopleRefs);
for (CFIndex i=0; i < count; i++) {
ABRecordRef ref = CFArrayGetValueAtIndex(peopleRefs, i);
NSDate* datemod = ( NSDate *)(ABRecordCopyValue(ref, kABPersonModificationDateProperty));
NSDate *lastopened = [userdefs valueForKey:#"LastOpenedDate"];
NSTimeInterval datemodifiedtime =[datemod timeIntervalSince1970];
NSNumber *modifieddatenumber= [NSNumber numberWithDouble: datemodifiedtime];
NSTimeInterval lastopeddate = [lastopened timeIntervalSince1970];
NSNumber *lastopenednumber= [NSNumber numberWithDouble: lastopeddate];
if ([modifieddatenumber intValue]>[lastopenednumber intValue]) {
ABRecordRef aSource = CFArrayGetValueAtIndex(peopleRefs,i);
int recordid = ABRecordGetRecordID(aSource);
[changedrecords addObject:[NSString stringWithFormat:#"%d",recordid]];
}
}
NSString *arraystring= [changedrecords componentsJoinedByString:#","];
[userdefs setValue:arraystring forKey:#"ArrayOfChangedPeopleString"];
[userdefs setValue:changedrecords forKey:#"ArrayOfChangedPeople"];
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ([arraystring isEqualToString:#"(null)"]) {
arraystring = [arraystring stringByReplacingOccurrencesOfString:#"(null)" withString:#""];
}
NSLog(#"arraychangedstring= %# and length = %d",arraystring,arraystring.length);
NSLog(#"Must send data to the server here for this changed people array= %#",changedrecords);
if (arraystring.length>2) {
NSLog(#"inside if");
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allSources = ABAddressBookCopyArrayOfAllPeople( addressBook );
[userdefs setValue:#"" forKey:#"ArrayOfChangedPeopleString"];
[userdefs setValue:#"" forKey:#"ArrayOfChangedPeople"];
for (int i = 0; i<[changedrecords count]; i++) {
NSString *recordid= [changedrecords objectAtIndex:i];
int nPeople = [recordid intValue];
[IntoochUtil current_function_name:#"Inside getcontactdetails - Start"];
if(nPeople != 0){
// for (CFIndex i = nPeople_start; i < (nPeople_end); i++)
// {
// NSString *reocrdid = [NSString stringWithFormat: #"Record %ld",i];
// NSLog(#"Recordid= %#",reocrdid);
NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
//common field
NSString *first_name =nil;
NSString *mid_name = nil ;
NSString *last_name =nil ;
NSString *basic_email =nil ;
NSString *basic_mobile =nil ;
NSString *other_phone=nil;
NSString *pager_phone= nil;
//personal filed
NSString *Home_email =nil ;
NSString*home_mobile =nil ;
NSString*home_address =nil;
//business filed
NSString *work_email =nil ;
NSString *company_name =nil ;
NSString *job_title =nil ;
NSString*work_mobile =nil ;
NSString *iphone = nil;
NSString *main = nil;
NSString *work_address =nil ;
NSString *home_fax, *work_fax, *other_fax =nil;
NSString *birthday = nil;
// NSString *blogs = nil;
NSString *record_id;
ABRecordRef aSource = ABAddressBookGetPersonWithRecordID(addressBook, nPeople);
// Fetch all groups included in the current source
// Getting Record id from address book
int recordid = ABRecordGetRecordID(aSource);
record_id = [NSString stringWithFormat:#"%d",recordid];
// Getting Names from address book
// CFStringRef firstName = ABRecordCopyValue(aSource, kABPersonFirstNameProperty);
first_name= ABRecordCopyValue(aSource, kABPersonFirstNameProperty);
// first_name=[NSString stringWithFormat:#"%#",firstName];
// CFRelease(firstName);
// NSLog(#"First name= %#",first_name);
NSMutableDictionary *dict_name = [[NSMutableDictionary alloc]init];
if (!([first_name isEqualToString:#"(null)"]|| first_name == nil || first_name.length ==0))
{
[dict_name setValue:first_name forKey:#"FirstName"];
}
[first_name release];
mid_name= ABRecordCopyValue(aSource, kABPersonMiddleNameProperty);
// NSLog(#"mid name = %#",mid_name);
// CFRelease(midname);
if (!([mid_name isEqualToString:#"(null)"]|| mid_name == nil || mid_name.length ==0))
{
[dict_name setValue:mid_name forKey:#"MiddleName"];
}
[mid_name release];
last_name = ABRecordCopyValue(aSource, kABPersonLastNameProperty);
// NSLog(#"Last Name= %#",last_name);
// CFRelease(lastName);
if (!([last_name isEqualToString:#"(null)"]|| last_name == nil || last_name.length ==0))
{
[dict_name setValue:last_name forKey:#"LastName"];
}
[last_name release];
NSString *dictNamestring = [NSString stringWithFormat:#"%#",dict_name];
if (!([dictNamestring isEqualToString:#"(null)"]|| dictNamestring == nil || dictNamestring.length <4))
{
[dict setValue:dict_name forKey:#"Names"];
}
// [dict_name release];
// Getting Phone numbers from address book
NSMutableDictionary *dict_phone = [[NSMutableDictionary alloc]init];
ABMultiValueRef phones =(NSString*)ABRecordCopyValue(aSource, kABPersonPhoneProperty);
NSString* mobileLabel;
for(CFIndex i = 0; i < ABMultiValueGetCount(phones); i++) {
mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i);
if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel])
{
home_mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i) ;
[dict_phone setValue:home_mobile forKey:#"Mobile"];
}
else if ([mobileLabel isEqualToString:(NSString*)kABHomeLabel])
{
basic_mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
[dict_phone setValue:basic_mobile forKey:#"Home"];
}
else if([mobileLabel isEqualToString:(NSString *)kABWorkLabel])
{
work_mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
[dict_phone setValue:work_mobile forKey:#"Work"];
}
else if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneIPhoneLabel])
{
iphone = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
[dict_phone setValue:iphone forKey:#"iPhone"];
}
else if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMainLabel])
{
main = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
[dict_phone setValue:main forKey:#"Main"];
}
else if ([mobileLabel isEqualToString:(NSString*)kABOtherLabel])
{
other_phone = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
[dict_phone setValue:other_phone forKey:#"OtherPhone"];
}
else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhonePagerLabel])
{
pager_phone = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
[dict_phone setValue:pager_phone forKey:#"Pager"];
}
else
{
NSLog(#"%# label is not processed",mobileLabel);
}
}
CFRelease(phones);
NSString *dictphonestring = [NSString stringWithFormat:#"%#",dict_phone];
if (!([dictphonestring isEqualToString:#"(null)"]|| dictphonestring == nil || dictphonestring.length <4))
{
[dict setValue:dict_phone forKey:#"PhoneNos"];
}
// [dict_phone release];
// Getting Fax numbers from address book
NSMutableDictionary *dict_fax = [[NSMutableDictionary alloc]init];
ABMultiValueRef faxes =(NSString*)ABRecordCopyValue(aSource, kABPersonPhoneProperty);
NSString* FaxLabel;
for(CFIndex i = 0; i < ABMultiValueGetCount(faxes); i++) {
FaxLabel = (NSString*)ABMultiValueCopyLabelAtIndex(faxes, i);
if([FaxLabel isEqualToString:(NSString *)kABPersonPhoneHomeFAXLabel])
{
home_fax = (NSString*)ABMultiValueCopyValueAtIndex(faxes, i) ;
[dict_fax setValue:home_fax forKey:#"Home"];
}
if ([FaxLabel isEqualToString:(NSString*)kABPersonPhoneWorkFAXLabel])
{
work_fax = (NSString*)ABMultiValueCopyValueAtIndex(faxes, i);
[dict_fax setValue:work_fax forKey:#"Work"];
}
if([FaxLabel isEqualToString:(NSString *)kABPersonPhoneOtherFAXLabel])
{
other_fax = (NSString*)ABMultiValueCopyValueAtIndex(faxes, i);
[dict_fax setValue:other_fax forKey:#"Other"];
}
}
CFRelease(faxes);
NSString *dictfaxstring = [NSString stringWithFormat:#"%#",dict_fax];
if (!([dictfaxstring isEqualToString:#"(null)"]|| dictfaxstring == nil || dictfaxstring.length <4))
{
[dict setValue:dict_fax forKey:#"FaxNos"];
}
[dict_fax release];
// Getting emails from address book
ABMultiValueRef email = ABRecordCopyValue(aSource, kABPersonEmailProperty);
NSMutableDictionary *dict_email = [[NSMutableDictionary alloc]init];
NSString* email_lbl;
for(CFIndex i = 0; i < ABMultiValueGetCount(email); i++) {
email_lbl = (NSString*)ABMultiValueCopyLabelAtIndex(email, i);
if([email_lbl isEqualToString:(NSString *)kABHomeLabel])
{
Home_email = [(NSString*)ABMultiValueCopyValueAtIndex(email, i)retain];
[dict_email setValue:Home_email forKey:#"Home"];
}
else if([email_lbl isEqualToString:(NSString *)kABWorkLabel])
{
work_email = [(NSString*)ABMultiValueCopyValueAtIndex(email, i)retain];
[dict_email setValue:work_email forKey:#"Work"];
}
else if([email_lbl isEqualToString:(NSString *)kABOtherLabel])
{
basic_email = [(NSString*)ABMultiValueCopyValueAtIndex(email, i)retain];
[dict_email setValue:basic_email forKey:#"Other"];
}
else
{
NSLog(#"%# label is processed as other",email_lbl);
basic_email = [(NSString*)ABMultiValueCopyValueAtIndex(email, i)retain];
[dict_email setValue:basic_email forKey:#"Other"];
}
}
CFRelease(email);
NSString *dictemailstring = [NSString stringWithFormat:#"%#",dict_email];
if (!([dictemailstring isEqualToString:#"(null)"]|| dictemailstring == nil || dictemailstring.length <4))
{
[dict setValue:dict_email forKey:#"Emails"];
}
// [dict_email release];
company_name = ABRecordCopyValue(aSource, kABPersonOrganizationProperty);
// NSLog(#"Company name= %#",company_name);
job_title = ABRecordCopyValue(aSource, kABPersonJobTitleProperty);
// NSLog(#"Job title= %#",job_title);
NSDate *birthdate = ABRecordCopyValue(aSource, kABPersonBirthdayProperty);
NSString *birthdate_string = [NSString stringWithFormat:#"%#",birthdate];
if (!([birthdate_string isEqualToString:#"(null)"]|| birthdate_string == nil || birthdate_string.length ==0)) {
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:birthdate];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
birthday = [NSString stringWithFormat:#"%d-%d-%d",day,month,year];
NSLog(#"birthday= %#",birthday);
}
[birthdate release];
// Getting addressess from address book
ABMultiValueRef address =(NSString*)ABRecordCopyValue(aSource, kABPersonAddressProperty);
NSDictionary *dict_address = [[NSMutableDictionary alloc]init];
NSString* addLabel;
for(CFIndex i = 0; i < ABMultiValueGetCount(address); i++) {
addLabel=(NSString*)ABMultiValueCopyLabelAtIndex(address, i);
if ([addLabel isEqualToString:(NSString*)kABWorkLabel]) {
NSMutableDictionary *dict_work_add = [(NSMutableDictionary *)ABMultiValueCopyValueAtIndex(address, i)retain];
work_address=[NSString stringWithFormat:#"%# %# %# %# %#",[dict_work_add objectForKey:#"Street"],[dict_work_add objectForKey:#"City"],[dict_work_add objectForKey:#"State"],[dict_work_add objectForKey:#"Country"],[dict_work_add objectForKey:#"ZIP"]] ;
work_address = [work_address stringByReplacingOccurrencesOfString:#"(null)" withString:#""];
work_address = [work_address stringByReplacingOccurrencesOfString:#"\n" withString:#""];
// NSLog(#"work address = [%#] and length= %d",work_address,work_address.length);
if (!([work_address isEqualToString:#"(null)"]|| work_address == nil || work_address.length ==0))
{
[dict_address setValue:work_address forKey:#"Work"];
}
}
if ([addLabel isEqualToString:(NSString*)kABHomeLabel])
{
NSMutableDictionary *dict_home_add = [(NSMutableDictionary *)ABMultiValueCopyValueAtIndex(address, i)retain];
home_address = [NSString stringWithFormat:#"%# %# %# %# %#",[dict_home_add objectForKey:#"Street"],[dict_home_add objectForKey:#"City"],[dict_home_add objectForKey:#"State"],[dict_home_add objectForKey:#"Country"],[dict_home_add objectForKey:#"ZIP"]];
home_address = [home_address stringByReplacingOccurrencesOfString:#"(null)" withString:#""];
home_address = [home_address stringByReplacingOccurrencesOfString:#"\n" withString:#""];
// NSLog(#"home address = [%#] and length= %d",home_address,home_address.length);
if (!([home_address isEqualToString:#"(null)"]|| home_address == nil || home_address.length ==0))
{
[dict_address setValue:home_address forKey:#"Home"];
}
}
}
CFRelease(address);
NSString *dictaddrssstring = [NSString stringWithFormat:#"%#",dict_address];
if (!([dictaddrssstring isEqualToString:#"(null)"]|| dictaddrssstring == nil || dictaddrssstring.length <4))
{
[dict setValue:dict_address forKey:#"Addresses"];
}
[dict_address release];
// Getting Social Networks from address book
ABMultiValueRef social =(NSString*)ABRecordCopyValue(aSource, kABPersonSocialProfileProperty);
NSMutableDictionary *dict_social = [[NSMutableDictionary alloc]init];
if (social) {
for (int i = 0 ; i < ABMultiValueGetCount(social); i++) {
NSDictionary *socialDict = (NSDictionary *)ABMultiValueCopyValueAtIndex(social, i);
NSString *twitterid;
if ([socialDict[#"service"] isEqualToString:(NSString*)kABPersonSocialProfileServiceTwitter]) {
twitterid = (NSString*)socialDict[#"username"];
[dict_social setValue:twitterid forKey:#"Twitter"];
}
NSString *facebookid;
if ([socialDict[#"service"] isEqualToString:(NSString*)kABPersonSocialProfileServiceFacebook]) {
facebookid = (NSString*)socialDict[#"username"];
[dict_social setValue:facebookid forKey:#"Facebook"];
}
NSString *linkedinid;
if ([socialDict[#"service"] isEqualToString:(NSString*)kABPersonSocialProfileServiceLinkedIn]) {
linkedinid = (NSString*)socialDict[#"username"];
[dict_social setValue:linkedinid forKey:#"LinkedIn"];
}
NSString *gamecenterid;
if ([socialDict[#"service"] isEqualToString:(NSString*)kABPersonSocialProfileServiceGameCenter]) {
gamecenterid = (NSString*)socialDict[#"username"];
[dict_social setValue:gamecenterid forKey:#"GameCenter"];
}
NSString *myspaceid;
if ([socialDict[#"service"] isEqualToString:(NSString*)kABPersonSocialProfileServiceMyspace]) {
myspaceid = (NSString*)socialDict[#"username"];
[dict_social setValue:myspaceid forKey:#"MySpace"];
}
NSString *flickerid;
if ([socialDict[#"service"] isEqualToString:(NSString*)kABPersonSocialProfileServiceFlickr]) {
flickerid = (NSString*)socialDict[#"username"];
[dict_social setValue:flickerid forKey:#"Flicker"];
}
[socialDict release];
}
CFRelease(social);
}
NSString *dictsocialstring = [NSString stringWithFormat:#"%#",dict_social];
if (!([dictsocialstring isEqualToString:#"(null)"]|| dictsocialstring == nil || dictsocialstring.length <4))
{
[dict setValue:dict_social forKey:#"SocialNetworks"];
}
[dict_social release];
// Getting Other Fields from address book
NSMutableDictionary *dict_others = [[NSMutableDictionary alloc]init];
if (!([company_name isEqualToString:#"(null)"]||company_name == nil || company_name.length ==0)) {
[dict_others setValue:company_name forKey:#"CompanyName"];
}
if (!([job_title isEqualToString:#"(null)"]||job_title == nil || job_title.length ==0)) {
[dict_others setValue:job_title forKey:#"JobTitle"];
}
if (!([birthday isEqualToString:#"1-1-2001"]||[birthday isEqualToString:#"(null)"]||birthday == nil || birthday.length ==0)) {
[dict_others setValue:birthday forKey:#"BirthDay"];
}
NSString *dictothersstring = [NSString stringWithFormat:#"%#",dict_others];
if (!([dictothersstring isEqualToString:#"(null)"]|| dictothersstring == nil || dictothersstring.length <4))
{
[dict setValue:dict_others forKey:#"OtherInfo"];
}
[dict_others release];
[dict setValue:record_id forKey:#"RecordID"];
//This NSLog(#"Value for Dict is========= %# =========",dict);
NSString *namedictionstring = [NSString stringWithFormat:#"%#",dict_name];
NSString *emaildictstring = [NSString stringWithFormat:#"%#",dict_email];
NSString *phonedictstring = [NSString stringWithFormat:#"%#",dict_phone];
// NSLog(#"name dict length= %d email dict length= %d phone dict length = %d",namedictionstring.length,emaildictstring.length,phonedictstring.length);
// [array_addressbook addObject:dict];
if (phonedictstring.length >3) {
[arraytemp addObject:dict];
}
else
{
if (emaildictstring.length>3 && namedictionstring.length) {
[arraytemp addObject:dict] ;
}
else
{
NSLog(#"Contact is not valid= %#",dict_name);
}
}
[dict_name release];
[dict_phone release];
[dict_email release];
[dict release];
[company_name release];
[job_title release];
/* CFRelease(firstName);
CFRelease(midname);
CFRelease(lastName);
CFRelease(jobtitle);
CFRelease(birthday_c);
CFRelease(companyname);*/
// }
}
}
NSString *json_array_string = [arraytemp JSONRepresentation];
[IntoochUtil current_function_name:#"Inside getcontactdetails - End"];
NSLog(#"Json String To send= %#",json_array_string);
if (allSources) {
CFRelease(allSources);
}
if (addressBook) {
CFRelease(addressBook);
}
}
else
{
NSLog(#"This is empty.... nothing to perform");
NSMutableArray *arrayofdeletedpeoples= [[NSMutableArray alloc]init];
ABAddressBookRef addressbook = ABAddressBookCreate();
CFArrayRef allPeoples= ABAddressBookCopyArrayOfAllPeople(addressbook);
NSMutableArray *arrayofrecordIDCallback = [[NSMutableArray alloc]init];
int count = CFArrayGetCount(allPeoples);
for (int i =0; i<count; i++) {
ABRecordRef aSource = CFArrayGetValueAtIndex(allPeoples,i);
NSString * recordid = [NSString stringWithFormat:#"%d",ABRecordGetRecordID(aSource)];
[arrayofrecordIDCallback addObject:recordid];
}
NSLog(#"arrayofrecordIDCallback = %# and count= %d",arrayofrecordIDCallback,[arrayofrecordIDCallback count]);
NSMutableArray *arrayofallrecordids = [userdefs valueForKey:#"AllRecordIDSBackGround"];
NSLog(#"arrayofallrecordids= %# and count= %d",arrayofallrecordids,[arrayofallrecordids count]);
for (int i=0 ; i< [arrayofallrecordids count]; i++) {
if ([arrayofrecordIDCallback containsObject:[arrayofallrecordids objectAtIndex:i]]) {
}
else
{
[arrayofdeletedpeoples addObject:[arrayofallrecordids objectAtIndex:i]];
}
}
NSLog(#"Array of deleted peoples= %#",arrayofdeletedpeoples);
[arrayofdeletedpeoples release];
[arrayofallrecordids release];
[arrayofrecordIDCallback release];
if (allPeoples) {
CFRelease(allPeoples);
}
if (addressbook) {
CFRelease(addressbook);
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[changedrecords release];
[userdefs release];
[arraytemp release];
NSLog(#"Ends Process");
NSTimeInterval timeStamptwo = [[NSDate date] timeIntervalSince1970];
NSNumber *timeStamptwoObj = [NSNumber numberWithDouble: timeStamptwo];
NSLog(#"Time Difference= %d",[timeStamptwoObj intValue]-[timeStamponeobj intValue]);
}
Yes thats true that you can not get specific notification on Phonebook changes. You will need to synch your data when callback notification fire.
void MyAddressBookExternalChangeCallback (ABAddressBookRef ntificationaddressbook,CFDictionaryRef info,void *context)
{
NSLog(#"Changed Detected......");
// synch data
}
The apps like viber, tango, watsapp also does the same thing but in Background thread.
If the app is terminated, then you will need to synch data when app gets started like in didFinishLaunchingWithOptions.
As far I know, you can't tell what are the difference - I bumped to this problem myself.
My solution was:
I had a local Core Data based address book, and every time I got this notification, I ran a background thread that synchronised the data, and notify in the end all the changes.
During the first time, I am dumping all the data in local database using sqlite, then on external change I am dumping new data from contacts database in dummy db in sqlite, then firing big long compare query based on what has changed. In our case, main focus was on phone numbers and name. Once you get change update that in your contacts db in sqlite.
I think even whatsapp is doing something similar. I checked the time taken to reflect the changes by whatsapp and our app almost are similar. Actually, my app is 2 secs faster than whatsapp in terms of reflecting changes.
Hope this will help.

How to search the iphone address book for a specific phone number?

I am developing an app that connects to another iphone using bonjour. One of its features is when I connect to the other device it will automatically check if I have the other persons phone number. So my problem is how do I check my address book for the phone number provided by the other device?
Here's an example extracted from one of my address book methods. I wasn't searching by phone number but this gives you an idea have how to move forward with what you need:
- (void) scanAddressBookSample
{
NSUInteger i;
NSUInteger k;
ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *people = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);
if ( people==nil )
{
NSLog(#"NO ADDRESS BOOK ENTRIES TO SCAN");
CFRelease(addressBook);
return;
}
for ( i=0; i<[people count]; i++ )
{
ABRecordRef person = (ABRecordRef)[people objectAtIndex:i];
//
// Phone Numbers
//
ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex phoneNumberCount = ABMultiValueGetCount( phoneNumbers );
for ( k=0; k<phoneNumberCount; k++ )
{
CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex( phoneNumbers, k );
CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex( phoneNumbers, k );
CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel( phoneNumberLabel ); // converts "_$!<Work>!$_" to "work" and "_$!<Mobile>!$_" to "mobile"
// Find the ones you want here
//
NSLog(#"-----PHONE ENTRY -> %# : %#", phoneNumberLocalizedLabel, phoneNumberValue );
CFRelease(phoneNumberLocalizedLabel);
CFRelease(phoneNumberLabel);
CFRelease(phoneNumberValue);
}
}
[people release];
CFRelease(addressBook);
}
-(void)createQuickAccessContacts{
NSMutableDictionary contactDictionary= [[NSMutableDictionary alloc]init];
CFArrayRef all = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex n = ABAddressBookGetPersonCount(addressBook);
NSDate *date=[NSDate date];
for( int i = 0 ; i < n ; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex(all, i);
ABMultiValueRef phones = (ABMultiValueRef)ABRecordCopyValue(ref, kABPersonPhoneProperty);
for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++)
{
CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j);
NSString *phoneNumber = (__bridge NSString *)phoneNumberRef;
[contactDictionary setObject:(__bridge id)(ref) forKey:phoneNumber];
}
}
NSLog(#" Time taken %f for %i contacts",[[NSDate date] timeIntervalSinceDate:date],[contactDictionary count]);
}
This takes like 0.5 sec for 2.5k contacts to fill
then you can find the contact using number
ABRecordRef ref= [contactDictionary objectForKey:#"89xxxxxxx"];
its super fast takes like 0.000x seconds
Use This. this is my code.
NSLog(#"=====Make People Array with Numbers. Start.");
peopleWithNumber = [[NSMutableDictionary alloc] init];
for (int i=0; i < [people count]; i++) {
NSInteger phoneCount = [self phoneCountAtIndex:i];
if (phoneCount != 0) {
NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init];
for (int j=0 ; j < phoneCount ; j++) {
[phoneNumbers addObject:[self phoneNumberAtIndex:i phoneIndex:j]];
}
[peopleWithNumber addEntriesFromDictionary:
[NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithArray:phoneNumbers], [self fullNameAtIndex:i], nil]];
}
}
NSLog(#"=====Make People Array with Numbers. End.\n");
search method. it would be faster than using array
"NSArray *people = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);"
- (NSArray *)searchNamesByNumber:(NSString *)number {
NSString *predicateString = [NSString stringWithFormat:#"%#[SELF] contains '%#'",#"%#",number];
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:predicateString,peopleWithNumber,number];
NSArray *names = [[peopleWithNumber allKeys] filteredArrayUsingPredicate:searchPredicate];
return names;
}

iPhone SDK Accessing Address book company contact

I have been able to use the SDK to access Address Book contacts for people, but whenever I pick a contact who is a company, my app crashes.
does anyone know the property for the company field?
does anyone know the code to make it work?
thanks in advance
It seems your issue is not related to company tag itself. AB fields need to be managed carefully, released when not used and checked for nil all the time, many fields are not set.
In principle, here is example of how I use it. This function loads contacts (those fields interested for my app) and returns array with contacts to the caller. Hope this is helpful. Note how I release not needed refs.
- (NSArray *)loadContacts
{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
NSMutableArray *contacts = [NSMutableArray array];
for (int i = 0 ; i < nPeople ; i++ ) {
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
NSString *firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *fullName;
if (firstName && lastName) {
fullName = [NSString stringWithFormat:#"%# %#", firstName, lastName];
} else {
if (firstName) {
fullName = [NSString stringWithString:firstName];
} else if (lastName) {
fullName = [NSString stringWithString:lastName];
} else {
continue;
}
}
NSString *email = nil;
ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
if (emails) {
NSArray *emailAddresses = [(NSArray *)ABMultiValueCopyArrayOfAllValues(emails) autorelease];
if (emailAddresses && [emailAddresses count] > 0)
email = [emailAddresses objectAtIndex:0];
CFRelease(emails);
}
if (email) {
NSDictionary *contact = [NSDictionary
dictionaryWithObjectsAndKeys:fullName, #"name",
email, #"email", nil];
[contacts addObject:contact];
}
if (firstName)
CFRelease(firstName);
if (lastName)
CFRelease(lastName);
}
CFRelease(allPeople);
CFRelease(addressBook);
return contacts;
}
you need to use kABPersonOrganizationProperty property for get the company name from addressbook