iOS将电话号码转换为国际格式

在我的iOS应用程序中,我必须将电话号码(取自联系人)转换为国际格式(使用extern库自动发送短信)。 我看到了libPhoneNumber,但问题是我们必须input国家代码,并且应用程序必须在所有(几乎)国家工作,所以我不知道用户的国家是什么。

以下是图书馆的工作原理:

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)) 

格式化的PhoneNumberSubstring接收部分电话号码string,并将其格式化为格式正确的国际号码的开头,例如“16463”变为“+1 646-3”。

 NSString *formattedPhoneNumberSubstring(NSString *phoneNumber) { NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; phoneNumber = [phoneUtil normalizeDigitsOnly:phoneNumber]; NSString *nationalNumber; NSNumber *countryCode = [phoneUtil extractCountryCode:phoneNumber nationalNumber:&nationalNumber]; if ([countryCode isEqualToNumber:@0]) return phoneNumber; NSString *regionCode = [[phoneUtil regionCodeFromCountryCode:countryCode] objectAtIndex:0]; NSString *paddedNationalNumber = [nationalNumber stringByPaddingToLength:15 withString:@"0" startingAtIndex:0]; NSString *formatted; NSString *formattedSubstr; for (int i=0; i < paddedNationalNumber.length; i++) { NSError *error = nil; formattedSubstr = [phoneUtil format:[phoneUtil parse:[paddedNationalNumber substringToIndex: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 substringToIndex:j]; 

}

您可以使用用户区域设置或用户地理位置来获取区域。 请参阅stackoverflow问题获取设备位置国家代码的更多细节。

如果您不知道电话号码的国家代码,则无法生成其国际格式。

你可以尝试使用手机的位置或其区域设置来猜测国家代码,但它不会是可靠的。 例如,我的电话号码是西class牙语,我目前在意大利,我的地区是新西兰。 我的联系人列表包含来自世界各地的号码,如果没有以国际格式input,则无法猜测每个号码使用哪个国家/地区代码。

如果你绝对不得不猜测,最好的办法可能是想想手机如何解释联系人列表中的数字。 这将要求您确定手机SIM卡的国家代码。 看到这个答案的相关问题的一种方法,或者这里有一些我使用过的Swift代码:

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

ISO国家代码可以用来查询拨号的国家代码; 上面链接的答案是一个示例表。