一。生成vcf文件如果要把我们iPhone通讯录里的数据, 生成vcf格式文件。 我们可以借助iCloud。 小技巧:通过iCloud导出iPhone通讯录的方法当然, 如果你想在应用中, 利用代码生成, 完全可以。先导出通讯录数据, 再解析, 再生成vcf文件即可。参考下面代码: 001. -(NSString*)generateVCardStringWithContacts:(CFArrayRef)contacts { 002. NSInteger counter = 0 ; 003. NSString *vcard = @ "" ; 004. 005. for (CFIndex i = 0 ; i < CFArrayGetCount(contacts); i++) { 006. 007. ABRecordRef person = CFArrayGetValueAtIndex(contacts, i); 008. 009. NSString *firstName = (NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); 010. firstName = (firstName ? firstName : @ "" ); 011. NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 012. lastName = (lastName ? lastName : @ "" ); 013. NSString *middleName = (NSString *)ABRecordCopyValue(person, kABPersonMiddleNameProperty); 014. NSString *prefix = (NSString *)ABRecordCopyValue(person, kABPersonPrefixProperty); 015. NSString *suffix = (NSString *)ABRecordCopyValue(person, kABPersonSuffixProperty); 016. NSString *nickName = (NSString *)ABRecordCopyValue(person, kABPersonNicknameProperty); 017. NSString *firstNamePhonetic = (NSString *)ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty); 018. NSString *lastNamePhonetic = (NSString *)ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty); 019. 020. NSString *organization = (NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty); 021. NSString *jobTitle = (NSString *)ABRecordCopyValue(person, kABPersonJobTitleProperty); 022. NSString *department = (NSString *)ABRecordCopyValue(person, kABPersonDepartmentProperty); 023. 024. NSString *compositeName = [NSString stringWithFormat:@ "%@%@" ,firstName,lastName]; 025. 026. if (i > 0 ) { 027. vcard = [vcard stringByAppendingFormat:@ "\n" ]; 028. } 029. 030. vcard = [vcard stringByAppendingFormat:@ "BEGIN:VCARD\nVERSION:3.0\nN:%@;%@;%@;%@;%@\n" , 031. (firstName ? firstName : @ "" ), 032. (lastName ? lastName : @ "" ), 033. (middleName ? middleName : @ "" ), 034. (prefix ? prefix : @ "" ), 035. (suffix ? suffix : @ "" ) 036. ]; 037. 038. vcard = [vcard stringByAppendingFormat:@ "FN:%@\n" ,compositeName]; 039. if (nickName) vcard = [vcard stringByAppendingFormat:@ "NICKNAME:%@\n" ,nickName]; 040. if (firstNamePhonetic) vcard = [vcard stringByAppendingFormat:@ "X-PHONETIC-FIRST-NAME:%@\n" ,firstNamePhonetic]; 041. if (lastNamePhonetic) vcard = [vcard stringByAppendingFormat:@ "X-PHONETIC-LAST-NAME:%@\n" ,lastNamePhonetic]; 042. 043. // Work 044. if (organization) vcard = [vcard stringByAppendingFormat:@ "ORG:%@;%@\n" ,(organization?organization:@ "" ),(department?department:@ "" )]; 045. 046. if (jobTitle) vcard = [vcard stringByAppendingFormat:@ "TITLE:%@\n" ,jobTitle]; 047. 048. // Mail 049. ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); 050. if (emails) { 051. for ( int k = 0 ; k < ABMultiValueGetCount(emails); k++) { 052. NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(emails, k)); 053. NSString *email = (NSString *)ABMultiValueCopyValueAtIndex(emails, k); 054. NSString *labelLower = [label lowercaseString]; 055. 056. vcard = [vcard stringByAppendingFormat:@ "EMAIL;type=INTERNET;type=WORK:%@\n" ,email]; 057. 058. if ([labelLower isEqualToString:@ "home" ]) vcard = [vcard stringByAppendingFormat:@ "EMAIL;type=INTERNET;type=HOME:%@\n" ,email]; 059. else if ([labelLower isEqualToString:@ "work" ]) vcard = [vcard stringByAppendingFormat:@ "EMAIL;type=INTERNET;type=WORK:%@\n" ,email]; 060. else { //类型解析不出来的 061. counter++; 062. vcard = [vcard stringByAppendingFormat:@ "item%d.EMAIL;type=INTERNET:%@\nitem%d.X-ABLabel:%@\n" ,counter,email,counter,label]; 063. } 064. } 065. } 066. 067. // Tel 068. ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); 069. if (phoneNumbers) { 070. for ( int k = 0 ; k < ABMultiValueGetCount(phoneNumbers); k++) { 071. NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phoneNumbers, k)); 072. NSString *number = (NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers, k); 073. NSString *labelLower = [label lowercaseString]; 074. 075. if ([labelLower isEqualToString:@ "mobile" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=CELL:%@\n" ,number]; 076. else if ([labelLower isEqualToString:@ "home" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=HOME:%@\n" ,number]; 077. else if ([labelLower isEqualToString:@ "work" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=WORK:%@\n" ,number]; 078. else if ([labelLower isEqualToString:@ "main" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=MAIN:%@\n" ,number]; 079. else if ([labelLower isEqualToString:@ "homefax" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=HOME;type=FAX:%@\n" ,number]; 080. else if ([labelLower isEqualToString:@ "workfax" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=WORK;type=FAX:%@\n" ,number]; 081. else if ([labelLower isEqualToString:@ "pager" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=PAGER:%@\n" ,number]; 082. else if ([labelLower isEqualToString:@ "other" ]) vcard = [vcard stringByAppendingFormat:@ "TEL;type=OTHER:%@\n" ,number]; 083. else { //类型解析不出来的 084. counter++; 085. vcard = [vcard stringByAppendingFormat:@ "item%d.TEL:%@\nitem%d.X-ABLabel:%@\n" ,counter,number,counter,label]; 086. } 087. } 088. } 089. 090. // Address 091. ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty); 092. if (address) { 093. for ( int k = 0 ; k < ABMultiValueGetCount(address); k++) { 094. NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(label, k)); 095. NSDictionary *dic = (NSDictionary *)ABMultiValueCopyLabelAtIndex(address, k); 096. NSString *labelLower = [label lowercaseString]; 097. NSString* country = [dic valueForKey:(NSString *)kABPersonAddressCountryKey]; 098. NSString* city = [dic valueForKey:(NSString *)kABPersonAddressCityKey]; 099. NSString* state = [dic valueForKey:(NSString *)kABPersonAddressStateKey]; 100. NSString* street = [dic valueForKey:(NSString *)kABPersonAddressStreetKey]; 101. NSString* zip = [dic valueForKey:(NSString *)kABPersonAddressZIPKey]; 102. NSString* countryCode = [dic valueForKey:(NSString *)kABPersonAddressCountryCodeKey]; 103. NSString *type = @ "" ; 104. NSString *labelField = @ "" ; 105. counter++; 106. 107. if ([labelLower isEqualToString:@ "work" ]) type = @ "WORK" ; 108. else if ([labelLower isEqualToString:@ "home" ]) type = @ "HOME" ; 109. else if (label && [label length] > 0 ) 110. { 111. labelField = [NSString stringWithFormat:@ "item%d.X-ABLabel:%@\n" ,counter,label]; 112. } 113. 114. vcard = [vcard stringByAppendingFormat:@ "item%d.ADR;type=%@:;;%@;%@;%@;%@;%@\n%@item%d.X-ABADR:%@\n" , 115. counter, 116. type, 117. (street ? street : @ "" ), 118. (city ? city : @ "" ), 119. (state ? state : @ "" ), 120. (zip ? zip : @ "" ), 121. (country ? country : @ "" ), 122. labelField, 123. counter, 124. (countryCode ? countryCode : @ "" ) 125. ]; 126. } 127. } 128. 129. 130. // 剩下的不常用,我就不写了,要是需要,自己补全 131. // url 132. // TODO: 133. 134. // IM 135. // TODO: 136. 137. // Photo 138. // TODO: 139. 140. vcard = [vcard stringByAppendingString:@ "END:VCARD" ]; 141. } 142. 143. return vcard; 144. } 二。解析vcf文件用 UIDocumentInteractionController 也就是用QuickLook去显示这个文件。 那他会自动的解析, 并且有添加到通讯录选项。 当然,我们也可以自己来解析。 具体代码如下: 01. //解析vcf 02. -( void )parseVCardString:(NSString*)vcardString 03. { 04. NSArray *lines = [vcardString componentsSeparatedByString:@ "\n" ]; 05. 06. for (NSString* line in lines) 07. { 08. 09. if ([line hasPrefix:@ "BEGIN" ]) 10. { 11. NSLog(@ "parse start" ); 12. } 13. else if ([line hasPrefix:@ "END" ]) 14. { 15. NSLog(@ "parse end" ); 16. } 17. else if ([line hasPrefix:@ "N:" ]) 18. { 19. NSArray *upperComponents = [line componentsSeparatedByString:@ ":" ]; 20. NSArray *components = [[upperComponents objectAtIndex: 1 ] componentsSeparatedByString:@ ";" ]; 21. 22. NSString * lastName = [components objectAtIndex: 0 ]; 23. NSString * firstName = [components objectAtIndex: 1 ]; 24. 25. NSLog(@ "name %@ %@" ,lastName,firstName); 26. 27. } 28. else if ([line hasPrefix:@ "EMAIL;" ]) 29. { 30. NSArray *components = [line componentsSeparatedByString:@ ":" ]; 31. NSString *emailAddress = [components objectAtIndex: 1 ]; 32. NSLog(@ "emailAddress %@" ,emailAddress); 33. 34. } 35. else if ([line hasPrefix:@ "TEL;" ]) 36. { 37. NSArray *components = [line componentsSeparatedByString:@ ":" ]; 38. NSString *phoneNumber = [components objectAtIndex: 1 ]; 39. NSLog(@ "phoneNumber %@" ,phoneNumber); 40. } 41. } 42. 43. } |
|