如何创build地址簿和联系人

我创build了一个地址簿和联系人的地方显示联系人的代码。它工作正常,但突然间得到运行时错误。因为我是新来的ios。我无法find错误可以在堆栈溢出告诉错误。

- (void)viewDidLoad { [super viewDidLoad]; self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; self.view.backgroundColor = [UIColor yellowColor]; self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(gotohomepage:)]autorelease]; ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; [[picker navigationBar] setBarStyle:UIBarStyleBlack]; picker.peoplePickerDelegate = self; // Display only a person's phone, email, and birthdate NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty],nil]; picker.displayedProperties = displayedItems; [self presentModalViewController:picker animated:YES]; [picker release]; } - (IBAction)gotohomepage:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { ABAddressBookRef addressBook = ABAddressBookCreate(); int i; NSString *strName = @""; NSString* company = @""; NSString *address = @""; NSString *suburb = @""; NSString *postalcode = @""; NSString *state = @""; NSString *country = @""; NSString *mobile = @""; NSString *phone = @""; NSString *emailid = @""; strName = (NSString *)ABRecordCopyCompositeName((ABRecordRef) person); CFStringRef name = ABRecordCopyCompositeName((ABRecordRef) person); company = (NSString *)ABRecordCopyValue((ABRecordRef) person, kABPersonOrganizationProperty); NSArray* allPeople = (NSArray *)ABAddressBookCopyPeopleWithName(addressBook,name); CFRelease(name); for (i = 0; i < [allPeople count]; i++) { ABRecordRef record = [allPeople objectAtIndex:i]; ABMutableMultiValueRef multiValue = ABRecordCopyValue(record, kABPersonAddressProperty); for(CFIndex i=0; i<ABMultiValueGetCount(multiValue); i++) { NSString* HomeLabel = (NSString*)ABMultiValueCopyLabelAtIndex(multiValue, i); if([HomeLabel isEqualToString:@"_$!<Home>!$_"]) { CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(multiValue, i); address = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressStreetKey)]; suburb = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressCityKey)]; postalcode = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressZIPKey)]; state = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressStateKey)]; country = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressCountryKey)]; CFRelease(dict); } CFRelease(HomeLabel); } CFRelease(multiValue); } CFRelease(allPeople); ABMultiValueRef phones =(NSString*)ABRecordCopyValue(person, kABPersonPhoneProperty); NSString* mobileLabel = nil; for(CFIndex i = 0; i < ABMultiValueGetCount(phones); i++) { mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i); if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) { mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); NSLog(@"phone %@",mobile); } else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { phone = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); NSLog(@"phone %@",phone); CFRelease(mobileLabel); break ; } CFRelease(mobileLabel); } CFStringRef value, label; ABMutableMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); CFIndex count = ABMultiValueGetCount(multi); if (count == 1) { value = ABMultiValueCopyValueAtIndex(multi, 0); emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); CFRelease(value); } else { for (CFIndex i = 0; i < count; i++) { label = ABMultiValueCopyLabelAtIndex(multi, i); value = ABMultiValueCopyValueAtIndex(multi, i); // check for Work e-mail label if (CFStringCompare(label, kABWorkLabel, 0) == 0) { emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); } else if(CFStringCompare(label, kABHomeLabel, 0) == 0) { emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); } CFRelease(label); CFRelease(value); } } CFRelease(multi); CFRelease(phones); CFRelease(addressBook); [self dismissModalViewControllerAnimated:YES]; return NO; } 

在iOS6上,苹果引入新的隐私控制,用户可以通过每个应用程序控制联系和日历的访问。 所以,在代码方面,你需要添加一些方法来请求权限。 在iOS5或之前,我们可以随时致电

 ABAddressBookRef addressBook = ABAddressBookCreate(); 

获取地址簿没有任何问题,但在iOS6中,如果你没有权限,这个调用将只返回空指针。 那为什么我们需要改变方法来获取ABAddressBookRef。

这种types的错误通常出现在未授予访问通讯录权限的情况下。在这种情况下,请添加这段代码

 __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; } if (accessGranted) { // Do whatever you want here. } 

礼貌: – http://programmerjoe.blogspot.in/2012/10/ios6-permissions-contacts.html

如果这不能解决你的问题回我..

错误的是,因为在IOS6上,苹果增加了一些function,没有人有权获得没有所有者的许可的内容。