2012-12-27 94 views
5

我想在地址簿中創建一個新聯繫人。 當您想要存儲更多URL(某些社交網絡的網址)時,會出現此問題。我的代碼在iOS6的模擬器中完美工作。但在iOS6的真實iPhone中,存儲除url之外的所有值。 我一直在尋找幾天,找不到解決方案,我會很感激,如果有人能幫助。多值url地址簿iphone

我的代碼:

-(void) addContactToAddressBook:(ABAddressBookRef) iPhoneAddressBook 
{ 

    CFErrorRef error = NULL; 

    ABRecordRef newPerson = ABPersonCreate(); 

    //Name and phone number 
    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (__bridge CFStringRef)_nameField.text, &error); 
    ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
    ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFStringRef)_phoneField.text, kABPersonPhoneMainLabel, NULL); 
    ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone,nil); 

    //Email value 
    ABMutableMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
    ABMultiValueAddValueAndLabel(emailMultiValue, (__bridge CFStringRef)_emailField.text, kABWorkLabel, NULL); 
    ABRecordSetValue(newPerson, kABPersonEmailProperty, emailMultiValue, nil); 
    CFRelease(emailMultiValue); 

    //URL values 
    ABMutableMultiValueRef urlMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_FacebookField.text, (CFStringRef)@"Facebook", NULL); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_twitterField.text, (CFStringRef)@"Twitter", NULL); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_linkedinField.text, (CFStringRef)@"Linkedin", NULL); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_googleField.text, (CFStringRef)@"Google+", NULL); 
    ABRecordSetValue(newPerson, kABPersonURLProperty, urlMultiValue, nil); 
    CFRelease(urlMultiValue); 

    ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error); 

    ABAddressBookSave(iPhoneAddressBook, &error); 
    if (error != NULL) 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Contact not saved" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil]; 
     [alert show]; 
    }else{ 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Contact saved" message:@"Your contact was successfully saved" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
     [alert show]; 
    } 
} 

謝謝!

+0

任何人都可以幫助我嗎?我找不到解決方案.... 謝謝。 – Joan

回答

0

根據蘋果網站上的文檔(向下滾動到頁面中間的隱私),必須先授予對地址簿的訪問權限,然後才能以編程方式進行訪問。這是我最終做的。

-(void)requestPermission 
{ 
     ABAddressBookRef iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL); 

     if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
      ABAddressBookRequestAccessWithCompletion(iPhoneAddressBook, ^(bool granted, CFErrorRef error) { 
       if (granted) { 
        // First time access has been granted, add the contact 
        [self addContactToAddressBook:iPhoneAddressBook]; 
       } else { 
        // User denied access 
        // Display an alert telling user the contact could not be added 
       } 
      }); 
     } 
     else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
      // The user has previously given access, add the contact 
      [self addContactToAddressBook:iPhoneAddressBook]; 
     } 
     else { 
      // The user has previously denied access 
      // Send an alert telling user to change privacy setting in settings app 
     } 

    } 

-(void)addContactToAddressBook:(ABAddressBookRef)iPhoneAddressBook 
{ 
    CFErrorRef error = NULL; 
    ABRecordRef newPerson = ABPersonCreate(); 

    //Name and phone number 
    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (__bridge CFStringRef)_nameField.text, &error); 
    ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
    ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFStringRef)_phoneField.text, kABPersonPhoneMainLabel, NULL); 
    ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone,nil); 
    CFRelease(multiPhone); 

    //Email value 
    ABMutableMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
    ABMultiValueAddValueAndLabel(emailMultiValue, (__bridge CFStringRef)_emailField.text, kABWorkLabel, NULL); 
    ABRecordSetValue(newPerson, kABPersonEmailProperty, emailMultiValue, nil); 
    CFRelease(emailMultiValue); 

    //URL values 
    ABMutableMultiValueRef urlMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_FacebookField.text, (CFStringRef)@"Facebook", NULL); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_twitterField.text, (CFStringRef)@"Twitter", NULL); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_linkedinField.text, (CFStringRef)@"Linkedin", NULL); 
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef)_googleField.text, (CFStringRef)@"Google+", NULL); 
    ABRecordSetValue(newPerson, kABPersonURLProperty, urlMultiValue, nil); 
    CFRelease(urlMultiValue); 

    // ... 
    // Set other properties 
    // ... 
    ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error); 

    ABAddressBookSave(iPhoneAddressBook, &error); 
    CFRelease(newPerson); 
    CFRelease(iPhoneAddressBook); 
    if (error != NULL) 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Contact not saved" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil]; 
     [alert show]; 
    }else{ 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Contact saved" message:@"Your contact was successfully saved" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
     [alert show]; 
    } 
}