二维码数字名片因为其便捷的交换和存储方式得到广泛应用,如果你希望生成的二维码名片可以被智能设备识别。那就应遵循某种标准格式。常见的是生成vCard标准格式。一个简单的vCard名片格式例子参考如下:
BEGIN:VCARD
VERSION:3.0
FN:皮特
TEL;TYPE=CELL:1234567890
EMAIL:mailto:example@example.com
ORG:东方科技
ROLE:产品研发部
ADT;WORK;POSTAL:广州市海珠区鼎新路1号
END:VCARD
当然该格式中的信息只是较常用的,vCard中可以包含的信息非常多,有兴趣的可以去这里查看。
这篇文章主要分享两点:
一、如何解析并获取vCard中的数据
你可能笑了,扫描二维码名片后,直接就可以获取到vCard中的所有信息啊。没错,不过我们拿到的是就像上图中的格式一样的字符串,我们如果要知道或者保存名片中的联系人,电话,邮箱等信息,就需要对字符串进行处理,以便拿到我们想到的信息。其实如果你仔细观察上图就会发现,每个键值对后边都进行了换行。那么我们就可以根据换行符\n来对字符串进行处理。你可能会想根据\n去截取字符串,方向对,但是没必要那么麻烦,因为iOS系统库为我们提供了接口,使我们可以根据某个特定字符串把要处理的字符串切割成数组。额...好像有点绕,没关系,接下来我们来详细说明一下。
系统库中有一个NSString的名为NSStringEncodingDetection的类别
@interface NSString (NSStringExtensionMethods)
它有个可以帮我们完成把字符串按传入字符串参数切割成数组的接口。
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
此外还有一个类似的接口
- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator NS_AVAILABLE(10_5, 2_0);
不过此处就不做更多说明了,有兴趣可以看看这篇文章
接着上边接口说,接口由NSString类型的对象调用,传入字符串参数separator也就是你想要用的分割字符,然后返回切割好的字符串组成的数组,通过打印扫码获取的字符串我们已经提前知道vCard中每个字段对应的信息,比如:FN:是姓名;TEL;CELL;VOICE:是手机号等等,这样就知道我们要的名字、电话、邮箱等分别是什么字段,那么通过遍历数组并比较字段头就可以分别拿到这些信息了。比如我们扫码后得到的字符串命名为qrString,那么通过如下代码我们就可以获取到vCard中的姓名和电话。
NSArray *vCardInfoAry = [qrString componentsSeparatedByString:@"\n"];
for(NSString* line in vCardInfoAry) {
NSString *lineStr = [NSString stringWithFormat:@"%@",line];
if ([line hasPrefix:@"BEGIN"]) {
NSLog(@"parsing start");
} else if ([line hasPrefix:@"END"]) {
NSLog(@"parsing end");
} else if ([line hasPrefix:@"FN:"]) {
NSString *name = [lineStr stringByReplacingOccurrencesOfString:@"FN:" withString:@""];
NSLog(@"获取的vCard name : %@",name);
} else if ([line hasPrefix:@"TEL;CELL;VOICE:"]){
NSString *tel = [lineStr stringByReplacingOccurrencesOfString:@"TEL;CELL;VOICE:" withString:@""];
NSLog(@"获取的vCard tel : %@",tel);
} else if ([line hasPrefix:@"EMAIL;TYPE=WORK,VOICE:"]){
NSString *email = [lineStr stringByReplacingOccurrencesOfString:@"EMAIL;TYPE=WORK,VOICE:" withString:@""];
NSLog(@"获取的vCard email : %@",email);
}
}
二、如何生成通用可识别的vCard数字名片
如果上述的vCard解析你明白了,那么如何生成其实你已经学会了。好,那这一点可以略过了....。
不过为了本着严谨的态度,还是说一下吧。就像我们拿到的vCard字符串一样,我们也需要生成那样的字符串,并把我们想要包含的信息写进去,很简单,上代码:
NSString *vcardStr = [NSString stringWithFormat:@" BEGIN:VCARD\n VERSION:3.0\n FN:%@\n TEL;CELL;VOICE:%@\n TEL;TYPE=WORK,VOICE:%@\n EMAIL;TYPE=WORK,VOICE:%@\n URL:%@\n ORG:%@\n ROlE:%@\n TITLE:%@\n ADR;WORK;POSTAL:%@\n END:VCARD",name,tel,phone,email,url,company,partment,title,address];
传入的字符串变量就是我们想要包含的信息,然后再把生成的字符串生成二维码,你的vCard数字名片就生成了,下图就是用微信扫描vCard的结果页。
喜欢就点个赞呗!
欢迎大家提出更好的改进意见和建议,从搬砖到设计建筑的路上,你我同行!