Vérifier les exports vCard iOS sur Mac cloud : champs et relecture

Vérifier les exports vCard iOS sur Mac cloud : champs et relecture

Vous exportez les contacts de vos clients au format .vcf. La feuille de partage s’ouvre bien, mais après l’importation, il ne reste qu’un seul numéro et le point-virgule du nom a changé de place. Une capture d’écran ne suffit pas à valider ce type de résultat. Sur un Mac cloud, commencez par vérifier la chaîne « génération des données → nouvelle analyse → comparaison champ par champ », puis contrôlez le partage et l’importation sur iOS. Vous pourrez ainsi distinguer les erreurs de format des problèmes d’interface.

Définir d’abord les données à préserver

Cet article vérifie la conversion du modèle en mémoire de l’application vers vCard, sans lire le véritable carnet d’adresses. Utilisez des contacts synthétiques couvrant les caractères chinois, les caractères accentués, plusieurs numéros et des libellés personnalisés, pour éviter que des données personnelles ne se retrouvent dans les journaux de compilation.

Le contrat initial peut rester simple : le nom de famille et le prénom doivent être restitués à l’identique ; les numéros de téléphone doivent conserver leur chaîne d’origine ; l’association entre chaque libellé personnalisé et son numéro ne doit pas changer ; aucun champ vide ne doit recevoir spontanément une valeur par défaut métier. La normalisation des numéros relève d’une logique distincte : ne supprimez pas au passage le signe plus initial lors de l’exportation.

Un fichier qui peut être analysé prouve seulement que sa syntaxe est acceptable. Seule la comparaison des champs après relecture permet de vérifier que cette conversion n’a pas perdu les données qui vous importent.

Laissez pour l’instant de côté les photos, les notes et les groupes. Leurs contraintes de volume, d’accès ou de compatibilité sont différentes. Il vaut mieux leur consacrer des jeux de données supplémentaires plutôt que de mêler tous les champs dans un même échec.

Établir une référence avec le sérialiseur système

Sur un Mac cloud équipé des outils en ligne de commande Xcode, enregistrez le contenu suivant dans vcard-check.swift. Ce script utilise uniquement Foundation et Contacts. Il n’appelle aucune API de consultation du carnet d’adresses et ne nécessite aucune autorisation d’accès aux contacts.

import Foundation
import Contacts

struct CheckFailure: Error {
    let field: String
}

func require(_ condition: Bool, _ field: String) throws {
    if !condition {
        throw CheckFailure(field: field)
    }
}

func phones(_ contact: CNContact) -> [String: String] {
    var result: [String: String] = [:]
    for item in contact.phoneNumbers {
        result[item.label ?? ""] = item.value.stringValue
    }
    return result
}

do {
    let source = CNMutableContact()
    source.familyName = "林;测试"
    source.givenName = "Zoë,研发"
    source.phoneNumbers = [
        CNLabeledValue(
            label: "build-primary",
            value: CNPhoneNumber(stringValue: "+12025550101")
        ),
        CNLabeledValue(
            label: "build-secondary",
            value: CNPhoneNumber(stringValue: "+12025550102")
        )
    ]

    let data = try CNContactVCardSerialization.data(with: [source])
    try data.write(to: URL(fileURLWithPath: "contact.vcf"),
                   options: .atomic)

    let contacts = try CNContactVCardSerialization.contacts(with: data)
    try require(contacts.count == 1, "contact-count")
    let restored = contacts[0]
    try require(restored.familyName == source.familyName, "family-name")
    try require(restored.givenName == source.givenName, "given-name")
    try require(restored.phoneNumbers.count == 2, "phone-count")
    try require(phones(restored) == phones(source), "phone-values")
} catch {
    FileHandle.standardError.write(Data("vCard check failed\n".utf8))
    exit(1)
}

Après l’exécution, vérifiez le code de sortie du processus au lieu de rechercher un message de réussite :

mkdir -p artifacts/vcard
cd artifacts/vcard
xcrun swift ../../vcard-check.swift

Cet exemple suppose que le script se trouve à la racine du dépôt. Ne poursuivez le pipeline que si la commande renvoie zéro ; en cas d’échec, interrompez les étapes de livraison suivantes. Dans un projet réel, placez les assertions dans une cible de test afin que le rapport indique précisément le champ en échec. N’affichez pas le contenu brut des contacts dans les journaux.

Isoler les caractères spéciaux dans des cas de test distincts

La virgule et le point-virgule de l’exemple sont intentionnels. Ces caractères ont un rôle structurel dans vCard : une simple concaténation de texte risque de découper un nom en plusieurs composants. Utilisez le sérialiseur système pour établir la référence, plutôt que d’écrire vos propres règles de remplacement puis de chercher à démontrer qu’elles sont correctes.

Ajoutez ensuite trois jeux d’entrée : un nom contenant une barre oblique inverse, un nom d’entreprise contenant un saut de ligne et une chaîne multioctet suffisamment longue. Ne faites varier qu’un seul paramètre à la fois. Relisez la propriété correspondante et vérifiez que le nombre total de contacts reste égal à un, afin de détecter un saut de ligne interprété à tort comme une propriété ou un enregistrement supplémentaire.

La longueur d’une ligne ne se mesure pas au nombre de caractères

Les lignes physiques d’un fichier vCard peuvent être repliées, et les caractères chinois n’occupent pas tous le même nombre d’octets que les autres caractères. N’implémentez pas le repliement en insérant un saut de ligne après un nombre fixe de caractères Swift. Évitez également de fabriquer un analyseur maison à coups de split ligne par ligne. Si vous maintenez un encodeur indépendant, vérifiez les règles au niveau des octets pour la version de vCard qu’il déclare prendre en charge, puis faites relire sa sortie par Contacts.

L’exemple construit un dictionnaire indexé par libellé : cette méthode ne convient qu’à des données de test dont les libellés sont uniques. Les contacts réels peuvent contenir des libellés identiques. Pour étendre les tests, comparez plutôt des multiensembles de couples « libellé, numéro », en conservant le nombre d’occurrences de chaque couple.

Distinguer l’équivalence sémantique de l’identité des fichiers

Lorsqu’un même contact est sérialisé à nouveau, l’ordre des propriétés et le repliement des lignes peuvent varier, ce qui rend les instantanés de fichiers peu adaptés à une comparaison directe. Comparez en priorité les champs après analyse. Réservez le hachage du fichier au contrôle de l’intégrité du transfert, plutôt que de l’utiliser pour juger de l’équivalence sémantique des contacts.

Pour les exportations par lot, ajoutez des cas avec un tableau vide, un seul contact et plusieurs contacts. Identifiez chaque enregistrement à l’aide d’un nom unique réservé aux tests, sans dépendre de l’ordre du tableau renvoyé par l’analyse. Vérifiez séparément le nombre d’enregistrements, les valeurs des champs et le nombre d’éléments des champs multivalués, afin qu’un écrasement dans un dictionnaire ne masque pas une perte de données.

La relecture par le framework système de ses propres données ne constitue pas non plus une preuve complète d’interopérabilité entre applications. Si les destinataires utilisent d’autres outils d’importation, conservez le même jeu de fichiers synthétiques et validez-le avec chacun d’eux. Toute conversion de libellés non pris en charge doit faire l’objet d’un contrat explicite, et non être passée sous silence.

Intégrer le contrôle au pipeline et compléter la validation sur iOS

Exécutez ce contrôle rapide du format après les modifications liées à la fonction de partage, et consignez les versions du système et de la chaîne d’outils. En cas d’échec, n’archivez que les fichiers .vcf synthétiques et les identifiants des erreurs de champ. En cas de réussite, nettoyez le répertoire selon la politique de conservation du pipeline. N’utilisez pas un véritable carnet d’adresses comme jeu de données de test.

Sur iOS, vérifiez aussi l’extension du fichier, le type de données fourni par l’élément partagé et le contenu du fichier effectivement lu par l’application cible. Après l’importation dans un environnement de test dédié, contrôlez les deux numéros, les libellés personnalisés et les caractères spéciaux, puis supprimez les enregistrements de test. Les résultats du simulateur ne remplacent pas une vérification sur l’appareil cible avec l’application d’importation prévue.

Conservez enfin trois conclusions distinctes : les données générées peuvent être analysées, les champs essentiels sont préservés à la relecture et le fichier partagé peut être correctement importé par l’application cible. Si l’une de ces vérifications échoue, revenez à la couche concernée. Ne supprimez pas les caractères spéciaux et ne conservez pas uniquement le premier numéro pour donner l’illusion que les tests passent.

Questions fréquentes

Le test nécessite-t-il l’autorisation d’accéder aux contacts ?

Non. Il crée des contacts en mémoire et transforme les données sans lire ni modifier le carnet d’adresses du système.

Pourquoi éviter une comparaison octet par octet ?

L’ordre des propriétés et le pliage des lignes peuvent varier. Il faut d’abord analyser le fichier et comparer les valeurs selon le contrat de chaque champ.

Lancez votre prochain build sur une station de travail dans le cloud

Un Mac mini entier rien que pour vous, sans virtualisation. Choisissez la durée selon votre projet ; la disponibilité réelle est indiquée en temps réel dans la console.

Louer un Mac dans le cloud

Vérifiez la configuration avant de planifier votre projet

Consultez les cycles de facturation et les options de Desk M4, ou préparez votre première connexion avec le guide de démarrage.