4

我有一个应用程序,我想将通讯录详细信息导入到 vcard 格式中。这是我已经完成的代码,但问题是我的电子邮件地址、照片、组织名称等没有保存在 vcard 中。

    -(NSString*)vcardrepresentation
{


        NSMutableArray *mutableArray = [[NSMutableArray alloc] init];

        [mutableArray addObject:@"BEGIN:VCARD"];
        [mutableArray addObject:@"VERSION:3.0"];

        [mutableArray addObject:[NSString stringWithFormat:@"FN:%@ %@", self.contactlist.objContact.firstname,self.contactlist.objContact.lastname]];

        [mutableArray addObject:[NSString stringWithFormat:@"ORG:%@",self.contactlist.objContact.companyname]];
        [mutableArray addObject:[NSString stringWithFormat:@"ADR:%@",self.contactlist.objContact.City]];

        if ([phoneArray count]!=0)
            [mutableArray addObject:[NSString stringWithFormat:@"TEL:%@", phoneemail.phoneNumber]];

        if ([emailArray count]!=0)
        {
            [mutableArray addObject:[NSString stringWithFormat:@"EMAIL:%@",phoneemail.phoneNumber]];
        }
    if ([contactlist.objContact.Photo length]==0)
    {
        [mutableArray addObject:[NSString stringWithFormat:@"PHOTO:%@",[UIImage imageNamed:@"man.png"]]];
    }
    else
    {

        [mutableArray addObject:[NSString stringWithFormat:@"PHOTO:%@",[UIImage imageWithData:contactlist.objContact.Photo]]];
    }


        [mutableArray addObject:@"END:VCARD"];

        NSString *string = [mutableArray componentsJoinedByString:@"\n"];


        return string;

}

如何以 vcard 格式保存所有联系人数据?

4

2 回答 2

1

(1) 看起来您正在将EMAIL属性的值设置为电话号码。

(2)ADR属性格式不正确。正确的格式是将地址分隔成单独的组件,用分号分隔。格式为:

ADR:post-office-box;extended-address;street-address;city;state;zip-code;country

如果地址缺少组件(例如,它没有邮政信箱),则应使用空字符串。因此,一个ADR值应始终包含 6 个分号。

(3) 分号、逗号、反斜杠,尤其是换行符应该在所有 vCard 属性值中进行转义。分号和逗号字符在某些属性(例如ADRORG)中具有特殊含义,因此这些字符对于这些属性进行转义尤为重要。字符用反斜杠转义,如下所示:\;, \,, \\, \n.

(4) 小心折叠。规范建议每行不得超过 75 个字符(不包括换行符)。如果一行超出此限制,则可以通过插入换行符并在行首添加至少一个制表符或空格字符来“折叠”它(如@rjobidon 的答案所示)。

(5) vCard 的正确换行顺序\r\n不是\n.

于 2012-12-27T21:55:06.567 回答
1

Rani,我建议使用以下伪代码:

  1. 获取联系人照片作为 NSData (contactlist.objContact.Photo)
  2. 将 NSData 字节转换为 BASE 64 编码方案(NSData 到 base64base64EncodedString
  3. 将编码数据和属性添加到 vCard:

[mutableArray addObject:[NSString stringWithFormat:@"PHOTO;ENCODING=BASE64;TYPE=JPEG:%@", data]];

供您参考vCard 照片是使用 Base 64 方案编码的图像。支持 16 种文件格式,包括 GIF 和 JPEG。这是一个例子:

照片;编码=BASE64;类型=GIF:
    R0lGODdhfgA4AOYAAAAAAK+vr62trVIxa6WlpZ+fnzEpCEpzlAha/0Kc74+PjyGM
    SuecKRhrtX9/fzExORBSjCEYCGtra2NjYyF7nDGE50JrhAg51qWtOTl7vee1MWu1
    50o5e3PO/3sxcwAx/4R7GBgQOcDAwFoAQt61hJyMGHuUSpRKIf8A/wAY54yMjHtz
    ...
于 2012-12-27T15:31:34.497 回答