在我的iOS应用程序中,我必须转换电话号码(在联系人中拍摄)并以国际格式转换(使用外部库自动发送短信)。我看到libPhoneNumber,但问题是我们必须输入国家/地区代码,应用程序必须在所有(几乎)国家/地区工作,所以我不知道用户的国家/地区。
以下是图书馆的工作方式:
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))
答案 0 :(得分:1)
formattedPhoneNumberSubstring接受部分电话号码字符串,并将其格式化为格式正确的国际号码的开头,例如“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];
}
答案 1 :(得分:0)
您可以使用用户区域设置或用户地理位置来获取区域。 有关详细信息,请参阅stackoverflow question get device location country code。
答案 2 :(得分:0)
如果您不知道电话号码的国家/地区代码,则无法生成电话号码的国际格式。
您可以尝试使用手机的位置或其区域设置来猜测国家/地区代码,但它不可靠。例如,我的电话号码是西班牙语,我目前在意大利,我的地区设在新西兰。我的联系人列表包含来自世界各地的数字,如果没有以国际格式输入,则无法猜出每个号码使用哪个国家/地区代码。
如果您绝对不得不猜测,最好的方法可能是考虑手机如何解释联系人列表中的数字。这将要求您确定手机SIM卡的国家/地区代码。有关这样做的方法,请参阅this answer to a related question,或者我使用的是一些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国家/地区代码可用于查找拨打的国家/地区代码;上面链接的答案中有一个示例表。