【问题标题】:iOS Convert phone number to international formatiOS 将电话号码转换为国际格式
【发布时间】:2016-04-05 08:06:52
【问题描述】:

在我的 iOS 应用程序中,我必须转换电话号码(在联系人中获取)并将其转换为国际格式(使用外部库自动发送 SMS)。我看到了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))

【问题讨论】:

  • 如果您不知道电话号码的国家代码,则无法生成国际格式。您可以尝试使用手机的位置或其区域设置来猜测国家代码,但这并不可靠。例如,我的电话号码是西班牙语,我目前在意大利,我的地区设置为新西兰。我的联系人列表包含来自世界各地的号码,如果它们不是以国际格式输入的,就无法猜测每个号码使用哪个国家/地区代码。

标签: ios swift phone-number libphonenumber


【解决方案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];

}

【讨论】:

    【解决方案2】:

    您可以使用用户区域设置或用户地理位置来获取区域。 详情请见stackoverflow question get device location country code

    【讨论】:

    • 这假定用户联系人列表中的所有号码都来自与其区域设置相同的国家或他们当前所在的国家。
    • 我同意贾斯珀的观点。虽然从用户的角度来看,它最接近手机用来拨打号码的方式。
    • 也许 :) 用户的语言和地区设置往往令人惊讶。我在意大利,我的语言环境是英语(新西兰)。但是,我使用的是西班牙 SIM 卡,所以如果我尝试拨打非国际格式的号码,它会被解释为西班牙号码!
    【解决方案3】:

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

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

    如果您绝对必须猜测,最好的方法可能是考虑手机如何解释联系人列表中的数字。这将要求您确定手机 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 国家代码可用于查找国家代码以进行拨号;上面链接的答案中有一个示例表。

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      相关资源
      最近更新 更多