Iphone IOS通讯簿未从联系人列表中获取所有电话号码
我在IOS应用程序中使用Iphone IOS通讯簿未从联系人列表中获取所有电话号码,iphone,ios,abaddressbook,Iphone,Ios,Abaddressbook,我在IOS应用程序中使用Addressbook获取联系人姓名和号码,但奇怪的是,它显示了一些联系人的电话号码 我希望它能显示所有的联系人名单和电话号码 下面是我获取电话号码的代码: -(void)getAddressbookData { #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 ABAddressBookRef addressBook = ABAddressBookCreate(); #else
Addressbook
获取联系人姓名和号码,但奇怪的是,它显示了一些联系人的电话号码
我希望它能显示所有的联系人名单和电话号码
下面是我获取电话号码的代码:
-(void)getAddressbookData
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000
ABAddressBookRef addressBook = ABAddressBookCreate();
#else
CFErrorRef *error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
#endif
NSArray * people;
BOOL accessGranted = [self __addressBookAccessStatus:addressBook];
if (accessGranted)
{
people = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
// Do whatever you need with thePeople...
}
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
NSMutableArray *contactArray = [[NSMutableArray alloc] init];
for (CFIndex i = 0; i < nPeople; i++)
{
ABRecordRef record = CFArrayGetValueAtIndex((__bridge CFArrayRef)(people), i);
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
NSString *lastName = (__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty);
NSString *fullName = nil;
if (ABPersonGetCompositeNameFormat() == kABPersonCompositeNameFormatFirstNameFirst)
fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
else
fullName = [NSString stringWithFormat:@"%@, %@", lastName, firstName];
[contactArray addObject:fullName];
//
// Phone Numbers
//
ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(record, kABPersonPhoneProperty);
CFIndex phoneNumberCount = ABMultiValueGetCount( phoneNumbers );
NSMutableArray *numbersArray = [[NSMutableArray alloc] init];
for ( CFIndex 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 -> name:%@ : %@ : %@", fullName, phoneNumberLocalizedLabel, phoneNumberValue );
[numbersArray addObject:CFBridgingRelease(phoneNumberValue)];
CFRelease(phoneNumberLocalizedLabel);
CFRelease(phoneNumberLabel);
CFRelease(phoneNumberValue);
}
// NSLog(@"phone numbers %@", numbersArray);
[contactDictionary setObject:numbersArray forKey:fullName];
CFRelease(record);
}
selectContacts = contactArray;
// NSLog(@"dictionary of array %@", contactDictionary);
//NSLog(@"contacts count %d", [selectContacts count]);
}
-(BOOL)__addressBookAccessStatus:(ABAddressBookRef) addressBook
{
__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);
// dispatch_release(sema);
}
else { // we're on iOS 5 or older
accessGranted = YES;
}
return accessGranted;
}
-(void)getAddressbookData
{
#如果IPHONE操作系统版本最低要求<60000
ABAddressBookRef addressBook=ABAddressBookCreate();
#否则
CFErrorRef*错误=nil;
ABAddressBookRef addressBook=ABAddressBookCreateWithOptions(空,错误);
#恩迪夫
NSArray*人;
BOOL accessgrated=[self\uu addressBookAccessStatus:addressBook];
如果(已授予访问权限)
{
人员=(uuuu bridge_utransfer NSArray*)abAddressBookCopyArrayFallPeople(addressBook);
//对人民做你需要的一切。。。
}
CFIndex nppeople=ABAddressBookGetPersonCount(地址簿);
NSMutableArray*contactArray=[[NSMutableArray alloc]init];
对于(CFIndex i=0;i
ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *people = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
for(id person in people){
//fetch multiple phone nos.
ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
for (CFIndex j=0; j < ABMultiValueGetCount(multi); j++) {
NSString* phone = (NSString*)ABMultiValueCopyValueAtIndex(multi, j);
[numbersArray addObject:phone];
[phone release];
}
}
我正在使用此代码从我的通讯簿中访问手机号码,它工作正常
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allSources = ABAddressBookCopyArrayOfAllPeople( addressBook );
for (CFIndex i = 0; i < ABAddressBookGetPersonCount( addressBook ); i++)
{
ABRecordRef aSource = CFArrayGetValueAtIndex(allSources,i);
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) retain];
}
if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel])
{
basic_mobile = [(NSString*)ABMultiValueCopyValueAtIndex(phones, i)retain];
}
if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMainLabel])
{
work_mobile = [(NSString*)ABMultiValueCopyValueAtIndex(phones, i)retain];
}
}
ABAddressBookRef addressBook=ABAddressBookCreate();
CFArrayRef allSources=abAddressBookCopyArrayFallPeople(addressBook);
for(CFIndex i=0;i
你可以试试这个。这是@Samir答案的快速版本,对我来说很有用
var allNumbers: [AnyObject] = []
let adbk : ABAddressBook? = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue()
let people = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue() as NSArray as [ABRecord]
for person in people {
var phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue()
for j in 0..<ABMultiValueGetCount(phones) {
var phone: String = ABMultiValueCopyValueAtIndex(phones, j).takeRetainedValue() as String
allNumbers.append(phone)
}
}
println(allNumbers)
var allNumbers:[AnyObject]=[]
让adbk:ABAddressBook?=ABAddressBookCreateWithOptions(nil,nil).takeRetainedValue()
让people=abAddressBookCopyArrayFallPeople(adbk)。将restainedValue()作为NSArray作为[ABRecord]
为人处事{
var phones:ABMultiValueRef=ABRecordCopyValue(person,kABPersonPhoneProperty)
对于0中的j来说,你正在释放手机
,这很好,但是你没有释放多人
或人
或地址簿
。通过静态分析器运行此操作,它会指出漏洞。如果你更换(NSArray*)
和(NSString*)的铸件
使用CfBrigingRelease
,ARC会处理这个问题。(或者如果您使用\uuuu Bridgeing\u transfer
,比如OP,也会完成同样的事情。)不用说,在iOS 9中,Contacts
框架完全消除了这个问题,尽管这个问题显然早于该框架。
var allNumbers: [AnyObject] = []
let adbk : ABAddressBook? = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue()
let people = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue() as NSArray as [ABRecord]
for person in people {
var phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue()
for j in 0..<ABMultiValueGetCount(phones) {
var phone: String = ABMultiValueCopyValueAtIndex(phones, j).takeRetainedValue() as String
allNumbers.append(phone)
}
}
println(allNumbers)