ios - ABPersonSocialProfile 应用崩溃

标签 ios abaddressbook

我在向 ABRecordRef 添加新社交资料时遇到问题。它总是在 ABAdressBookSave 上返回崩溃 “[__NSCFString 计数]:发送到实例的无法识别的选择器”

ABMultiValueRef social = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
if(contact.socialTwitter != nil)
    ABMultiValueAddValueAndLabel(social, (__bridge CFTypeRef)([NSDictionary dictionaryWithObjectsAndKeys:
                                                               (NSString*)kABPersonSocialProfileServiceTwitter, kABPersonSocialProfileServiceKey,
                                                               (__bridge CFStringRef)contact.socialTwitter, kABPersonSocialProfileUsernameKey,
                                                               nil]), kABPersonSocialProfileServiceTwitter, NULL);


ABRecordSetValue(record, kABPersonSocialProfileProperty, social, &error);
CFRelease(social);

最佳答案

我在保存新联系人时遇到了同样的问题。看来你不能像这样保存所有属性。下面的代码对我有用。

ABRecordRef aRecord = ABPersonCreate(); 
            CFErrorRef  anError = NULL;

            // Username
            ABRecordSetValue(aRecord, kABPersonFirstNameProperty, username, &anError);

            // Phone Number.
            ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMultiValueAddValueAndLabel(multi, (CFStringRef)usercontact, kABWorkLabel, NULL);
            ABRecordSetValue(aRecord, kABPersonPhoneProperty, multi, &anError);
            CFRelease(multi);

            // Company
            ABRecordSetValue(aRecord, kABPersonDepartmentProperty, usercompany, &anError);

            // email
            NSLog(useremail);
            ABMutableMultiValueRef multiemail = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMultiValueAddValueAndLabel(multiemail, (CFStringRef)useremail, kABWorkLabel, NULL);
            ABRecordSetValue(aRecord, kABPersonEmailProperty, multiemail, &anError);
            CFRelease(multiemail);

            // website
            NSLog(userwebsite);
            ABMutableMultiValueRef multiweb = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMultiValueAddValueAndLabel(multiweb, (CFStringRef)userwebsite, kABWorkLabel, NULL);
            ABRecordSetValue(aRecord, kABPersonURLProperty, multiweb, &anError);
            CFRelease(multiemail);

            // Function
            ABRecordSetValue(aRecord, kABPersonJobTitleProperty, userrole, &anError);

            if (anError != NULL)
                NSLog(@\"error while creating..\");

            CFStringRef personname, personcompind, personemail, personfunction,  personwebsite, personcontact;

            personname = ABRecordCopyValue(aRecord, kABPersonFirstNameProperty); 
            personcompind = ABRecordCopyValue(aRecord, kABPersonDepartmentProperty); 
            personfunction = ABRecordCopyValue(aRecord, kABPersonJobTitleProperty); 
            personemail = ABRecordCopyValue(aRecord, kABPersonEmailProperty);
            personwebsite = ABRecordCopyValue(aRecord, kABPersonURLProperty);
            personcontact  = ABRecordCopyValue(aRecord, kABPersonPhoneProperty); 

            ABAddressBookRef addressBook; 
            CFErrorRef error = NULL; 
            addressBook = ABAddressBookCreate(); 

            BOOL isAdded = ABAddressBookAddRecord (addressBook, aRecord, &error);

            if(isAdded){

                NSLog(@\"added..\");
            }
            if (error != NULL) {
                NSLog(@\"ABAddressBookAddRecord %@\", error);
            } 
            error = NULL;

            BOOL isSaved = ABAddressBookSave (addressBook, &error);

            if(isSaved) {

                NSLog(@\"saved..\");
                UIAlertView *alertOnChoose = [[UIAlertView alloc] initWithTitle:@\"Phone added successfully to your addressbook\" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@\"Ok\", nil];
                [alertOnChoose show];
                [alertOnChoose release];
            }

            if (error != NULL) {

                NSLog(@\"ABAddressBookSave %@\", error);
                UIAlertView *alertOnChoose = [[UIAlertView alloc] initWithTitle:@\"Unable to save this time\" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@\"Ok\", nil];
                [alertOnChoose show];
                [alertOnChoose release];
            } 

            CFRelease(aRecord); 
            CFRelease(personname);
            CFRelease(personcompind);
            CFRelease(personcontact);
            CFRelease(personemail);
            CFRelease(personfunction);
            CFRelease(personwebsite);  
            CFRelease(addressBook);

关于ios - ABPersonSocialProfile 应用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976266/

相关文章:

ios - 远程服务器不可用时的本地通知

ios - 如何在任何 UICollectionViewCell 下方插入随机 View

ios - 调用函数 'ABRecordCopyValue' 返回一个保留计数为 +1 的 corefoundation 对象

cocoa - 唯一标识 ABRecord 记录 : Is [ABRecord uniqueId] immutable?

ios - 为什么需要为每个线程创建 ABAddressbookRef?

ios - 切换隐私设置将终止该应用程序

ios - 使用企业分发在 iOS 8 和 iOS 9 上推送通知

iOS 11 键盘和配件 View 之间有额外的空间

iOS通讯录: Cannot setup an ABNewPersonViewController in storyboard

ios - 为什么 NSIndexPath 长度总是显示 2?