【问题标题】:iPhone : How to get each element from QR code vCard?iPhone : 如何从二维码 vCard 中获取每个元素?
【发布时间】:2013-04-30 09:11:45
【问题描述】:

我正在开发一个简单的应用程序,用于读取 QR 码 vCard 并在 QR 码 vCard 中显示联系信息的详细信息。我可以扫描 vCard 并获取联系人的详细信息,如下所示

BEGIN:VCARD
VERSION:2.1
N:XX;XXXXXXXX
FN:XXXXXXXXX XX
TEL;WORK;VOICE:91999999999
EMAIL;WORK;INTERNET:sac@gmail.com
END:VCARD

但我需要解析其中的每个元素。细节如何解析,有哪些解析方式?

【问题讨论】:

  • 我们需要一些代码如何获取此信息,即您使用的二维码的代码。
  • @SAMIRRATHOD 我为此使用 Zbar sdk。

标签: iphone parsing qr-code vcf-vcard


【解决方案1】:

文档指向这个方法:

- (void) imagePickerController: (UIImagePickerController*) reader
 didFinishPickingMediaWithInfo: (NSDictionary*) info
{
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];

    ZBarSymbol *symbol = nil;

    for(symbol in results){

        NSString *upcString = symbol.data;

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Scanned UPC" message:[NSString stringWithFormat:@"The UPC read was: %@", upcString] delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];

        [alert show];

        [reader dismissModalViewControllerAnimated: YES];    
    }    

}

我会先看看它返回什么,也许可以尝试循环字典以获取更多数据

【讨论】:

  • 它将显示与我在问题中所说的相同。 BEGIN:VCARD 版本:2.1 N:XX;XXXXXXXX FN:XXXXXXXXX XX TEL;WORK;VOICE:91999999999 EMAIL;WORK;INTERNET:sac@gmail.com END:VCARD
  • BEGIN:VCARD 版本:3.0 N:Peter;;;; FN: Peter TITLE:CEO ORG:qrd°by URL;WORK:qrd.by EMAIL;INTERNET:peter@qrd.by END:VCARD 当我扫描 QRCode 时得到上面的字符串。现在我必须像这样显示自动填写的联系表格。见网址。 blog.qrd.by/wp-content/uploads/2017/09/vcard-qr-code.jpg请帮忙
【解决方案2】:

这个问题被问了很久。但现在回答也可能对导航到此页面的人有所帮助。您可以参考下面的方法来解析 VCF 数据。

    NSString *str = [NSString stringWithString:response.vcfString];
    NSArray *subStrings = [str componentsSeparatedByCharactersInSet:[NSCharacterSet      characterSetWithCharactersInString:@"\n"]];
    NSArray *getData = [[NSArray alloc]init];

    NSString *arr = @"";

    for (int i=0;i<[subStrings count];i++)
    {
        arr = [subStrings objectAtIndex:i];

        NSArray *abc = [arr componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@";"]];

        if([[abc objectAtIndex:0] isEqualToString:@"FN"])
        {
            getData=[[abc objectAtIndex:1] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"] ];

            if([getData count] > 1)
            fullName = [getData objectAtIndex:1];
        }
        else if([[abc objectAtIndex:0] isEqualToString:@"N"])
        {
            getData=[[abc objectAtIndex:1] componentsSeparatedByCharactersInSet:  [NSCharacterSet characterSetWithCharactersInString:@":"]];

            if([getData count] > 1)
            lastName = [getData objectAtIndex:1];
            FirstName = [abc objectAtIndex:2];
        }
        else if([[abc objectAtIndex:0] isEqualToString:@"TITLE"])
        {
            getData=[[abc objectAtIndex:1] componentsSeparatedByCharactersInSet:  [NSCharacterSet characterSetWithCharactersInString:@":"]];

            if([getData count] > 1)
            title = [getData objectAtIndex:1];
        }
        else if([[abc objectAtIndex:0] isEqualToString:@"TEL"])
        {
            NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
            if([abc count] == 3)
            {
                getData=[[abc objectAtIndex:2] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([[abc objectAtIndex:1] isEqualToString:@"WORK"])
                {
                    if([getData count] > 1)
                        [dict setObject:[getData objectAtIndex:1] forKey:@"Tel"];
                }
                else if([[abc objectAtIndex:1] isEqualToString:@"CELL"])
                {
                    if([getData count] > 1)
                        [dict setObject:[getData objectAtIndex:1] forKey:@"Tel"];
                }
            }
            else if([abc count] == 4)
            {
                getData=[[abc objectAtIndex:3] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([[abc objectAtIndex:1] isEqualToString:@"WORK"] && [[abc objectAtIndex:2] isEqualToString:@"FAX"])
                {
                    if([getData count] > 1)
                        [dict setObject:[getData objectAtIndex:1] forKey:@"Tel"];
                }
            }
            else
            {
                getData=[[abc objectAtIndex:1] componentsSeparatedByCharactersInSet:  [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([[getData objectAtIndex:0] isEqualToString:@"WORK"])
                {
                    if([getData count] > 1)
                        [dict setObject:[getData objectAtIndex:1] forKey:@"Tel"];
                }
                else if([[getData objectAtIndex:0] isEqualToString:@"FAX"])
                {
                    if([getData count] > 1)
                        [dict setObject:[getData objectAtIndex:1] forKey:@"Tel"];
                }
            }
            [_telList addObject:dict];
        }
        else if([[abc objectAtIndex:0] isEqualToString:@"EMAIL"])
        {
            NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

            if([abc count] == 3)
            {
                getData=[[abc objectAtIndex:2] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([[abc objectAtIndex:1] isEqualToString:@"WORK"])
                {
                    if([getData count] > 1)
                        [dict setObject:[getData objectAtIndex:1] forKey:@"Email"];
                }
            }
            else
            {
                getData=[[abc objectAtIndex:1] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([getData count] > 1)
                    [dict setObject:[getData objectAtIndex:1] forKey:@"Email"];
            }
            [_emailList addObject:dict];
        }
        else if([[abc objectAtIndex:0] isEqualToString:@"ORG"])
        {
            NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

            if([abc count] == 5)
            {
                getData=[[abc objectAtIndex:2] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([[abc objectAtIndex:1] isEqualToString:@"WORK"])
                {
                    NSString *orgStr = @"";
                    if([getData count] > 1)
                    {
                        orgStr = [getData objectAtIndex:1];
                    }
                    [dict setObject:[orgStr stringByAppendingString:[abc objectAtIndex:4]] forKey:@"Org"];
                }
            }
            else
            {
                getData=[[abc objectAtIndex:1] componentsSeparatedByCharactersInSet:  [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([getData count] > 1)
                    [dict setObject:[getData objectAtIndex:1] forKey:@"Org"];
            }
            [_orgList addObject:dict];
        }
        else if([[abc objectAtIndex:0] isEqualToString:@"ADR"])
        {
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            if([abc count] == 9)
            {
                [dict setObject:[abc objectAtIndex:4] forKey:@"Add"];
                [dict setObject:[abc objectAtIndex:8] forKey:@"Country"];
                [dict setObject:[abc objectAtIndex:7] forKey:@"Zip"];
                [dict setObject:[abc objectAtIndex:5] forKey:@"City"];
            }
            else
            {

            }

            [_addrList addObject:dict];
        }
        else if([[abc objectAtIndex:0] isEqualToString:@"URL"])
        {
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            if([abc count] == 3)
            {
                getData=[[abc objectAtIndex:2] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([getData count] > 1)
                    [dict setObject:[getData objectAtIndex:1] forKey:@"Url"];
            }
            else
            {
                getData=[[abc objectAtIndex:1] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":"]];

                if([getData count] > 1)
                    [dict setObject:[getData objectAtIndex:1] forKey:@"Url"];
            }

            [_urlList addObject:dict];
        }
        else
        {

        }
    }


    NSLog(@"Details:  \nFull Name - %@\nLast Name - %@\nFirst Name - %@\ntitle - %@\nEmail - %@\norg - %@\nAddress - %@\nUrl - %@", fullName,lastName,FirstName,title,[[_emailList valueForKey:@"description"] componentsJoinedByString:@""],[_orgList description],[_addrList description],[_urlList description] );

【讨论】:

    【解决方案3】:

    你可以使用二维码的编码器

    Encoder

    【讨论】:

      【解决方案4】:

      您可以使用CNContactVCardSerialization 从数据中获取CNContact 对象

      import Contacts
         if let data = str.data(using: .utf8) {
             do {
                let contacts = try CNContactVCardSerialization.contacts(with: data)
                let contact = contacts.first
                print("\(String(describing: contact?.familyName))")
                return contact
             } catch {
                print("Contact Error: \(error.localizedDescription)")
             }
          }
      

      【讨论】:

      • BEGIN:VCARD 版本:3.0 N:Peter;;;; FN: Peter TITLE:CEO ORG:qrd°by URL;WORK:qrd.byEMAIL;INTERNET:peter@qrd.by END:VCARD 当我扫描 QRCode 时得到上面的字符串。现在我必须像这样显示自动填写的联系表格。见网址。 blog.qrd.by/wp-content/uploads/2017/09/vcard-qr-code.jpg请帮忙
      • @Ashu。我认为苹果没有提供任何公共 API 来显示默认联系表。目前我们必须手动创建它。
      • 但另一个应用程序也在这样做
      猜你喜欢
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 2020-06-29
      相关资源
      最近更新 更多