iOS Convertir le numéro de téléphone au format international

Dans mon application iOS, je dois convertir un numéro de téléphone (pris dans les contacts) et le convertir au format international (pour envoyer des SMS automatiquement avec une bibliothèque externe). J'ai vu libPhoneNumber mais le problème est que nous devons entrer le code du pays, et l'application doit travailler dans tous les (presque) pays, donc je ne sais pas quel est le pays de l'user.

Voici comment fonctionne la bibliothèque:

let phoneUtil = NBPhoneNumberUtil() let phoneNumberConverted = try phoneUtil.parse("0665268242", defaultRegion: "FR") // So I don't know the country of the user here print(try? phoneUtil.format(phoneNumberConverted, numberFormat: NBEPhoneNumberFormat.INTERNATIONAL)) 

formatedPhoneNumberSubssortingng prend une string partielle de numéro de téléphone et la met en forme comme le début d'un numéro international correctement formaté, par exemple "16463" devient "+1 646-3".

 NSSsortingng *formattedPhoneNumberSubssortingng(NSSsortingng *phoneNumber) { NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; phoneNumber = [phoneUtil normalizeDigitsOnly:phoneNumber]; NSSsortingng *nationalNumber; NSNumber *countryCode = [phoneUtil extractCountryCode:phoneNumber nationalNumber:&nationalNumber]; if ([countryCode isEqualToNumber:@0]) return phoneNumber; NSSsortingng *regionCode = [[phoneUtil regionCodeFromCountryCode:countryCode] objectAtIndex:0]; NSSsortingng *paddedNationalNumber = [nationalNumber ssortingngByPaddingToLength:15 withSsortingng:@"0" startingAtIndex:0]; NSSsortingng *formatted; NSSsortingng *formattedSubstr; for (int i=0; i < paddedNationalNumber.length; i++) { NSError *error = nil; formattedSubstr = [phoneUtil format:[phoneUtil parse:[paddedNationalNumber subssortingngToIndex:i] defaultRegion:regionCode error:&error] numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:&error]; if (getExtraCharacters(formattedSubstr) > getExtraCharacters(formatted)) // extra characters means more formatted formatted = formattedSubstr; } // Preparing the buffer for phoneNumber unichar phoneNumberBuffer[phoneNumber.length+1]; [phoneNumber getCharacters:phoneNumberBuffer range:NSMakeRange(0, phoneNumber.length)]; // Preparing the buffer for formatted unichar formattedBuffer[formatted.length+1]; [formatted getCharacters:formattedBuffer range:NSMakeRange(0, formatted.length)]; int j=0; for(int i = 0; i < phoneNumber.length && j < formatted.length; i++) { while(formattedBuffer[j] != phoneNumberBuffer[i]) j++; j++; } return [formatted subssortingngToIndex:j]; 

}

Vous pouvez get la région en utilisant les parameters régionaux des users ou la position géographique des users. Voir la question stackoverflow get le code du pays de l'location de l'appareil pour plus de détails.

Si vous ne connaissez pas le code de pays d'un numéro de téléphone, vous ne pouvez pas générer le format international de celui-ci.

Vous pouvez essayer d'utiliser l'location du téléphone ou ses parameters régionaux pour deviner le code du pays, mais ce ne sera pas fiable. Par exemple, mon numéro de téléphone est l'espagnol, je suis actuellement en Italie et ma région est en Nouvelle-Zélande. Ma list de contacts contient des numéros du monde entier, et s'ils n'étaient pas entrés dans un format international, il n'y aurait aucun moyen de deviner quel code de pays utiliser pour chaque numéro.

Si vous devez absolument deviner, la meilleure approche pourrait être de penser à la façon dont le téléphone interpréterait les numéros dans la list de contacts elle-même. Cela vous obligerait à déterminer le code de pays de la carte SIM du téléphone. Voir cette réponse à une question connexe pour un moyen de le faire, ou voici un code Swift que j'ai utilisé:

 let networkInfo = CTTelephonyNetworkInfo() if let carrier = networkInfo.subscriberCellularProvider { NSLog("Carrier: \(carrier.carrierName)") NSLog("ISO: \(carrier.isoCountryCode)") NSLog("MCC: \(carrier.mobileCountryCode)") NSLog("MNC: \(carrier.mobileNetworkCode)") } 

Le code de pays ISO peut être utilisé pour searchr un code de pays pour la numérotation; un exemple de table est dans la réponse liée ci-dessus.