2013-02-08 2 views
0

연락처를 표시하는 주소록 및 연락처에 대한 코드를 만들었습니다. 제대로 작동했지만 갑자기 런타임 오류가 발생합니다 .Ios에 익숙하지 않습니다. 찾을 수 없습니다. 오류가 스택 오버플로에서 오류를 말할 수 있습니다.주소록 및 연락처를 만드는 방법

- (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; 

} 
+0

스레드 1 같이 main에서 에러를 얻는 중 : signal SIGABRT – reddy

답변

0

IOS6에서 Apple은 소유자의 허가 없이는 아무도 콘텐츠를 얻을 수있는 권한이 없기 때문에 오류가 발생했습니다.

1

iOS6에서 사과는 새로운 개인 정보 제어 기능을 도입하여 사용자는 각 앱별로 연락처 및 캘린더 액세스를 제어 할 수 있습니다. 따라서 코드 측면에서 권한을 요청하는 방법을 추가해야합니다. iOS5를 년 또는 그 이전에, 우리는 항상 아무 문제없이 주소록을 얻기 위해

ABAddressBookRef addressBook = ABAddressBookCreate(); 

를 호출 할 수 있습니다,하지만 당신은 권한이없는 경우 iOS6의에서,이 호출은 단지 빈 포인터를 반환합니다. ABAddressBookRef를 얻기 위해 메소드를 변경해야하는 이유.

이러한 유형의 오류는 일반적으로 권한이 경우 book.In 주소에 접근을 허용하지 않는 경우

__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

이 않으면하지 해결할 수있는 문제 문제가 날 다시 ping ..

관련 문제