iOS开发中通讯录转Vcard、写入vcf文件

// MARK: ios9之后的通讯录转Vcard(版本3.0)字符串
+(NSString*)generateVCard30StringWithContacts:(NSArray<CNContact *> *)contacts {
    NSInteger counter  = 0;
    NSString *vcard = @"";
    
    for(CFIndex i = 0; i < contacts.count; i++) {
        CNContact *contact = contacts[i];
        NSString *firstName = contact.givenName;
        firstName = (firstName ?
                     firstName : @"");
        NSString *lastName = contact.familyName;
        lastName = (lastName ? lastName : @"");
        NSString *middleName = contact.middleName;
        NSString *prefix = contact.namePrefix;
        NSString *suffix = contact.nameSuffix;
        NSString *nickName = contact.nickname;
        NSString *firstNamePhonetic = contact.phoneticGivenName;
        NSString *lastNamePhonetic = contact.phoneticFamilyName;
        NSString *organization = contact.organizationName;
        NSString *jobTitle = contact.jobTitle;
        NSString *department = contact.departmentName;
        
        NSString *compositeName = [NSString stringWithFormat:@"%@%@",firstName,lastName];
        
        if(i > 0) {
            vcard = [vcard stringByAppendingFormat:@"\n"];
        }
        
        vcard = [vcard stringByAppendingFormat:@"BEGIN:VCARD\nVERSION:2.1\nN:%@;%@;%@;%@;%@\n", 
                 (firstName ?
                  firstName : @""),
                 (lastName ? lastName : @""),
                 (middleName ? middleName : @""),
                 (prefix ?
                  prefix : @""),
                 (suffix ? suffix : @"")
                 ];
        
        vcard = [vcard stringByAppendingFormat:@"FN:%@\n",compositeName];
        if(nickName) vcard = [vcard stringByAppendingFormat:@"NICKNAME:%@\n",nickName];
        if(firstNamePhonetic) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-FIRST-NAME:%@\n",firstNamePhonetic];
        if(lastNamePhonetic) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-LAST-NAME:%@\n",lastNamePhonetic];
        
        // Work
        if(organization) vcard = [vcard stringByAppendingFormat:@"ORG:%@;%@\n",(organization?
                                                                                
                                                                                organization:@""),(department?department:@"")];
        
        if(jobTitle) vcard = [vcard stringByAppendingFormat:@"TITLE:%@\n",jobTitle];
        
        // Mail
        if(contact.emailAddresses.count > 0) {
            for (int k = 0; k < contact.emailAddresses.count; k++) {
                CNLabeledValue<NSString*>* emailObject = contact.emailAddresses[k];
                NSString *label = emailObject.label;
                NSString *email = emailObject.value;
                NSString *labelLower = [label lowercaseString];
                
                vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=WORK:%@\n",email];
                
                if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=HOME:%@\n",email];
                else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=WORK:%@\n",email];
                else {//类型解析不出来的
                    counter++;
                    vcard = [vcard stringByAppendingFormat:@"item%li.EMAIL;type=INTERNET:%@\nitem%li.X-ABLabel:%@\n",(long)counter,email,(long)counter,label];
                }
            }
        }
        
        // Tel
        if(contact.phoneNumbers.count > 0) {
            for (int k = 0; k < contact.phoneNumbers.count; k++) {
                CNLabeledValue<CNPhoneNumber*>* phoneObject = contact.phoneNumbers[k];
                NSString *label = phoneObject.label;
                NSString *number = [phoneObject.value stringValue];
                NSString *labelLower = [label lowercaseString];
                
                if ([labelLower isEqualToString:@"mobile"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=CELL:%@\n",number];
                else if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=HOME:%@\n",number];
                else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=WORK:%@\n",number];
                else if ([labelLower isEqualToString:@"main"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=MAIN:%@\n",number];
                else if ([labelLower isEqualToString:@"homefax"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=HOME;type=FAX:%@\n",number];
                else if ([labelLower isEqualToString:@"workfax"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=WORK;type=FAX:%@\n",number];
                else if ([labelLower isEqualToString:@"pager"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=PAGER:%@\n",number];
                else if([labelLower isEqualToString:@"other"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=OTHER:%@\n",number];
                else { //类型解析不出来的
                    counter++;
                    vcard = [vcard stringByAppendingFormat:@"item%li.TEL:%@\nitem%li.X-ABLabel:%@\n",(long)counter,number,(long)counter,label];
                }
            }
        }
        
        // Address
        if(contact.postalAddresses.count > 0) {
            for (int k = 0; k < contact.postalAddresses.count; k++) {
                CNLabeledValue<CNPostalAddress*>* addressObject = contact.postalAddresses[k];
                NSString *label = addressObject.label; 
                CNPostalAddress *address = addressObject.value;
                NSString *labelLower = [label lowercaseString];
                NSString* country = address.country;
                NSString* city = address.city;
                NSString* state = address.state;
                NSString* street = address.street;
                NSString* zip = address.postalCode;
                NSString* countryCode = address.ISOCountryCode;
                NSString *type = @"";
                NSString *labelField = @"";
                counter++;
                
                if([labelLower isEqualToString:@"work"]) type = @"WORK";
                else if([labelLower isEqualToString:@"home"]) type = @"HOME";
                else if(label && [label length] > 0)
                {
                    labelField = [NSString stringWithFormat:@"item%li.X-ABLabel:%@\n",(long)counter,label];
                }
                
                vcard = [vcard stringByAppendingFormat:@"item%li.ADR;type=%@:;;%@;%@;%@;%@;%@\n%@item%li.X-ABADR:%@\n",
                         (long)counter,
                         type,
                         (street ? street : @""),
                         (city ? city : @""),
                         (state ? state : @""),
                         (zip ? zip : @""),
                         (country ? country : @""),
                         labelField,
                         (long)counter,
                         (countryCode ?
                          
                          countryCode : @"")
                         ];
            }
        }
        
        
        // 剩下的不经常使用,我就不写了,要是须要。自己补全
        // url
        // TODO:
        
        // IM
        // TODO:
        
        // Photo
        // TODO:
        if (contact.imageData != nil) {
            NSString *imageBase64Str = [contact.imageData base64EncodedStringWithOptions: NSDataBase64EncodingEndLineWithLineFeed];
            vcard = [vcard stringByAppendingFormat:@"PHOTO:<TYPE>image/jpg</TYPE><BINVAL>%@</BINVAL>\n", imageBase64Str];
        }
        
        vcard = [vcard stringByAppendingString:@"END:VCARD"];
    }
    
    return vcard;
}



// MARK: ios9之后的通讯录转Vcard(版本2.1)字符串
+(NSString*)generateVCard21StringWithContacts:(NSArray<CNContact *> *)contacts {
    NSInteger counter  = 0;
    NSString *vcard = @"";
    
    for(CFIndex i = 0; i < contacts.count; i++) {
        CNContact *contact = contacts[i];
        NSString *firstName = contact.givenName;
        firstName = (firstName ?
                     firstName : @"");
        NSString *lastName = contact.familyName;
        lastName = (lastName ? lastName : @"");
        NSString *middleName = contact.middleName;
        NSString *prefix = contact.namePrefix;
        NSString *suffix = contact.nameSuffix;
        
        // 编码
        firstName = [NSString stringAddEncodeWithString:firstName];
        lastName = [NSString stringAddEncodeWithString:lastName];
        middleName = [NSString stringAddEncodeWithString:middleName];
        
//        NSString *nickName = contact.nickname;
//        NSString *firstNamePhonetic = contact.phoneticGivenName;
//        NSString *lastNamePhonetic = contact.phoneticFamilyName;
//        NSString *organization = contact.organizationName;
//        NSString *jobTitle = contact.jobTitle;
//        NSString *department = contact.departmentName;
        
        NSString *compositeName = [NSString stringWithFormat:@"%@%@",firstName,lastName];
        
        if(i > 0) {
            vcard = [vcard stringByAppendingFormat:@"\n"];
        }
        
        vcard = [vcard stringByAppendingFormat:@"BEGIN:VCARD\nVERSION:2.1\nN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%@;%@;%@;%@;%@\n",
                 (firstName ?
                  firstName : @""),
                 (lastName ? lastName : @""),
                 (middleName ? middleName : @""),
                 (prefix ?
                  prefix : @""),
                 (suffix ? suffix : @"")
                 ];
        
        vcard = [vcard stringByAppendingFormat:@"FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%@\n",compositeName];
        
        // Tel
        if(contact.phoneNumbers.count > 0) {
            for (int k = 0; k < contact.phoneNumbers.count; k++) {
                CNLabeledValue<CNPhoneNumber*>* phoneObject = contact.phoneNumbers[k];
                NSString *label = phoneObject.label;
                NSString *number = [phoneObject.value stringValue];
                NSString *labelLower = [label lowercaseString];
                labelLower = [labelLower stringByReplacingOccurrencesOfString:@"_$!<" withString:@""];
                labelLower = [labelLower stringByReplacingOccurrencesOfString:@">!$_" withString:@""];
                
                if ([labelLower isEqualToString:@"mobile"]) vcard = [vcard stringByAppendingFormat:@"TEL;CELL:%@\n",number];
                else if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"TEL;HOME:%@\n",number];
                else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"TEL;WORK:%@\n",number];
                else if ([labelLower isEqualToString:@"main"]) vcard = [vcard stringByAppendingFormat:@"TEL;MAIN:%@\n",number];
                else if ([labelLower isEqualToString:@"homefax"]) vcard = [vcard stringByAppendingFormat:@"TEL;HOME;type=FAX:%@\n",number];
                else if ([labelLower isEqualToString:@"workfax"]) vcard = [vcard stringByAppendingFormat:@"TEL;WORK;FAX:%@\n",number];
                else if ([labelLower isEqualToString:@"pager"]) vcard = [vcard stringByAppendingFormat:@"TEL;PAGER:%@\n",number];
                else if([labelLower isEqualToString:@"other"]) vcard = [vcard stringByAppendingFormat:@"TEL;OTHER:%@\n",number];
                else { //类型解析不出来的
                    counter++;
//                    vcard = [vcard stringByAppendingFormat:@"item%i.TEL:%@\nitem%i.X-ABLabel:%@\n",counter,number,counter,label];
                }
            }
        }
        
        // Mail
        if(contact.emailAddresses.count > 0) {
            for (int k = 0; k < contact.emailAddresses.count; k++) {
                CNLabeledValue<NSString*>* emailObject = contact.emailAddresses[k];
                NSString *label = emailObject.label;
                NSString *email = emailObject.value;
                NSString *labelLower = [label lowercaseString];
                
                vcard = [vcard stringByAppendingFormat:@"EMAIL;WORK:%@\n",email];
                
                if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;HOME:%@\n",email];
                else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;WORK:%@\n",email];
                else {//类型解析不出来的
                    counter++;
//                    vcard = [vcard stringByAppendingFormat:@"item%i.EMAIL;type=INTERNET:%@\nitem%i.X-ABLabel:%@\n",counter,email,counter,label];
                }
            }
        }
        
        // Address
        if(contact.postalAddresses.count > 0) {
            for (int k = 0; k < contact.postalAddresses.count; k++) {
                CNLabeledValue<CNPostalAddress*>* addressObject = contact.postalAddresses[k];
                NSString *label = addressObject.label;
                CNPostalAddress *address = addressObject.value;
                NSString *labelLower = [label lowercaseString];
                NSString* country = address.country;
                NSString* city = address.city;
                NSString* state = address.state;
                NSString* street = address.street;
                NSString* zip = address.postalCode;
//                NSString* countryCode = address.ISOCountryCode;
                NSString *type = @"";
                NSString *labelField = @"";
                counter++;
                
                if([labelLower isEqualToString:@"work"]) type = @"WORK";
                else if([labelLower isEqualToString:@"home"]) type = @"HOME";
                else if(label && [label length] > 0)
                {
                    labelField = [NSString stringWithFormat:@"item%li.X-ABLabel:%@\n",(long)counter,label];
                }
                
                vcard = [vcard stringByAppendingFormat:@"ADR;%@:;;%@;%@;%@;%@;%@\n",
                         type,
                         (street ? street : @""),
                         (city ? city : @""),
                         (state ? state : @""),
                         (zip ? zip : @""),
                         (country ? country : @"")];
            }
        }
        
        
        // 剩下的不经常使用,我就不写了,要是须要。自己补全
        // url
        // TODO:
        
        // IM
        // TODO:
        
        // Photo
        // TODO:
        if (contact.imageDataAvailable) {
            NSString *imageBase64Str = [contact.imageData base64EncodedStringWithOptions: NSDataBase64EncodingEndLineWithLineFeed];
            vcard = [vcard stringByAppendingFormat:@"PHOTO;ENCODING=BASE64;JPEG:%@\n", imageBase64Str];
        }
        
        vcard = [vcard stringByAppendingString:@"END:VCARD"];
    }
    
    return vcard;
}

// 写字符串到文件中
+ (NSString *)writeStringToFile:(NSString *)writeStr andFileSuffix:(NSString *)fileType {
    // 获取带毫秒的时间戳
    NSDate *datenow = [NSDate date];
    NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)([datenow timeIntervalSince1970]*1000)];
    
    NSString *writePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@.%@", timeSp, fileType]];
    NSError *error;
    [writeStr writeToFile:writePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (error) {
        NSLog(@"导出失败");
        return nil;
    }else {
        NSLog(@"导出成功");
        return writePath;
    }
}

 

 

2. Vcard类型的文件(.vcf)解析成iOS中的CNContact

// responseObject = URL.init(fileURLWithPath: "/var/***/contacts.vcf")
let tempData = try? Data.init(contentsOf: responseObject as! URL)
let vcardStr = String.init(data: tempData!, encoding: String.Encoding.utf8)
let vcardstr2 = NSString.init(replaceEncodeWith: vcardStr)
let goalData = vcardstr2?.data(using: String.Encoding.utf8.rawValue)
                
let contacts = try? CNContactVCardSerialization.contacts(with: goalData!)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一.安装VcardWizard for Microsoft Outlook v2.32.0108 二.断开Internet连接(否则无法完成注册!!!)/ L# d. f4 l3 _( @ 三.打开Microsoft Outlook点击 帮助\4Team About\vCard Wizard2 L* L6 ]9 m+ V) h+ H 四.在弹出的VcardWizard注册面板复制Installation ID并点击Activate 弹出4Team vCardWizard-Online Activation面板(此面板别急着关闭,很多朋友无法注册就是因为这个!!!) 五.运行keygen.exe! 点击Click here to enable Offline Activation...按钮弹出offline activation succesfully enabled信息(这时可以看到4Team vCardWizard -Online Activation面板的Offline Activation...按钮已经不是灰色了),将复制的Installation ID填入第一栏生成Offline Activation Code并复制下来,) 回到软件注册面板点击Offline Activation...按钮,将Offline Activation Code填入后NEXT...提示Activation Successful注册成功!!! 六、插上数据线运行i5700同步套件,点选Outlook同步,联系人就同步到Outlook里了 七、运行VcardWizard,弹出select action for vCard wizard 对话框,选择export contacts to vcard后,弹出export contacts to vCard files窗口,设置输出文件位置。 这样就完成了导出,在硬盘上生成一个叫“联系人.vcf&rdquo;的文件。 八、导出的联系人文件copy到小5的储存卡下,再进入系统,选择导入导出-从SD卡导入,即完成联系人的移了。 九、想再A系统的通讯录、来电显示和短信里显示联系人头像么,继续往下看吧 你需要拥有一个gmail账户,登录后在通讯录里的“更多操作&rdquo;里点选“导入&rdquo; 05.jpg (大小:10.4 K 下载次数:0) 导入刚才导出过的那个联系人.vcf文件,当然这一步也可以通过A系统的google账户同步来完成。 导入后点开你想添加头像的联系人就可以添加头像图片了 06.jpg (大小:7.3 K 下载次数:0) 然后在系统的设置-账户与同步里添加好你的gmail账户密码,勾选&rdquo;背景数据“和&rdquo;自动同步“,然后点选你的gmail账户勾选&rdquo;同步联系人“,ok了,过一会儿你在PC端添加的联系人头像就同步到手机上了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Macle_Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值