iPhone:如何从QR码vCard获取每个元素?

时间:2013-04-30 09:11:46

标签: iphone parsing qr-code vcard

我正在开发一个简单的应用程序,用于读取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

但我需要解析其中的每个元素。如何解析细节以及解析的方法是什么?

4 个答案:

答案 0 :(得分: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];    
    }    

}

我首先会看到它返回的内容可能会尝试循环字典以获取更多数据

答案 1 :(得分:1)

很久以前,问这个问题了。但现在回答也可能有助于导航到此页面的人。您可以使用以下方法进行参考来解析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] );

答案 2 :(得分:0)

你可以使用QRCode的编码器

Encoder

答案 3 :(得分:0)

You can use CNContactVCardSerialization to get CNContact Object from data

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)")
       }
    }