Tengo vCards que fueron exportadas desde la aplicación de Contactos de Mac OS X 10.8.2. Por lo que puedo ver, Apple exportó las notas con RTF que fue comprimido con LZF y convirtió los datos comprimidos a base 64 antes de exportar la vCard. Estoy tratando de restaurar una exportación pero la versión actual (Sonoma 14.2.1) ignora el campo de notas de la vCard. (He eliminado la información de contacto pero no he tocado la sección X-APPLE-OL-NOTE.)
Aquí tienes un ejemplo de vCard:
BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//Mac OS X 10.8.2//ES
N:;Jane;;;(Baker) Smith
FN:Jane (Baker) Smith
TEL;type=HOME;type=VOICE;type=pref:(123) 123-4567
TEL;type=CELL;type=VOICE:(321) 321-7654
item1.ADR;type=HOME;type=pref:;;123 Any Street;Any Town;XX;T1T 1T1;Canada
item1.X-ABADR:ca
UID:CZTL-07DB0A0E-002E-0202-FF32-00816
X-ABUID:6EB029FB-BBBB-4242-A054-C5F4392245BD:ABPerson
X-EVOLUTION-FILE-AS:Smith, Jane
X-APPLE-OL-MAPPING-INFO:1
X-APPLE-OL-NOTE;TYPE=text/rtf;X-COMPRESSION=X-OL;X-HASH=03c582c83054be62e05
e09df57aff23b;X-HASHALGORITHM=X-zMD5;ENCODING=B:fAAAAI0AAABMWkZ1YU/S1F8AAwF
AAHIB9wK3VgSQZC0AcGECgAqScASQdzEYMTA0AUAPc2g5OIYwAUAAwRJnbDEMAd0Q4nIRMgsDDN
A1DAEM0F0P4DYC0QoRAUBpAUB1VGxuAiBlAgBjAUBjAQu1IChBYnJhaGBhbXNlKQ9AFcA=
END:VCARD
La nota en la vCard anterior es "(Abrahamse)".
He intentado leer la Nota con el siguiente código Swift (la vCard anterior está almacenada en disco como test.vcf):
import Foundation
import Contacts
func readVCard(filePath: String) {
do {
// Leer el contenido del archivo vCard
let vCardContent = try String(contentsOfFile: filePath, encoding: .utf8)
// Analizar los datos de la vCard
if let data = vCardContent.data(using: .utf8) {
let contacts = try CNContactVCardSerialization.contacts(with: data)
// Imprimir información de cada contacto
for contact in contacts {
print("Identificador de Contacto: \(contact.identifier)")
print("Nombre: \(contact.givenName)")
for phoneNumber in contact.phoneNumbers {
print("Número de Teléfono: \(phoneNumber.value.stringValue)")
}
print("Notas: \(contact.note)")
}
}
} catch {
print("Error al leer el archivo vCard: \(error.localizedDescription)")
}
}
// Uso de ejemplo: reemplaza "test.vcf" con la ruta real a tu archivo vCard
let vCardFilePath = "test.vcf"
readVCard(filePath: vCardFilePath)
El resultado de ejecutar el código es el siguiente -- la información de la nota no se extrae correctamente:
Identificador de Contacto: 2035C9D6-6A76-49F4-A5ED-C2C073A517CE:ABPerson
Nombre: Jane
Número de Teléfono: (123) 123-4567
Número de Teléfono: (321) 321-7654
Notas:
Programa finalizado con código de salida: 0
Usé el comando base64 en la terminal para decodificar las notas de 2 vCards y los primeros bytes fueron (de xxd):
test.vcf: 00000000: 7c00 0000 8d00 0000 4c5a 4675 614f d2d4 |.......LZFuaO..
second.vcf: 00000000: 5e1f 0000 4f4e 0000 4c5a 4675 59f1 0eeb ^...ON..LZFuY...
Entonces, la superposición principal es 4c5a 4675, correspondiente a LZFu. No pude emparejar eso con las pistas en la página Identifying Compression Algorithms.
¿Cómo podría extraer la nota correctamente?