Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS将电话号码转换为国际格式_Ios_Swift_Phone Number_Libphonenumber - Fatal编程技术网

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

iOS将电话号码转换为国际格式,ios,swift,phone-number,libphonenumber,Ios,Swift,Phone Number,Libphonenumber,在我的iOS应用程序中,我必须转换联系人中的电话号码,并将其转换为国际格式,以便使用外部库自动发送短信。我看到了,但问题是我们必须输入国家代码,而且应用程序必须在几乎所有的国家运行,所以我不知道用户的国家是什么 以下是图书馆的工作原理: let phoneUtil = NBPhoneNumberUtil() let phoneNumberConverted = try phoneUtil.parse("0665268242", defaultRegion: "FR") // So I don't

在我的iOS应用程序中,我必须转换联系人中的电话号码,并将其转换为国际格式,以便使用外部库自动发送短信。我看到了,但问题是我们必须输入国家代码,而且应用程序必须在几乎所有的国家运行,所以我不知道用户的国家是什么

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

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

您可以使用用户区域设置或用户地理位置获取区域。
有关更多详细信息,请参阅。

格式化电话号码子字符串采用部分电话号码字符串,并将其格式化为正确格式化的国际号码的开头,例如,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];

}

如果您不知道电话号码的国家/地区代码,则无法生成该号码的国际格式

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

如果你一定要猜,最好的方法可能是考虑手机如何解读联系人列表中的号码。这需要您确定手机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国家代码可用于查找拨号的国家代码;上面链接的答案中有一个示例表。

如果您不知道电话号码的国家代码,则无法生成国际格式。您可以尝试使用手机的位置或其地区设置来猜测国家/地区代码,但这并不可靠。例如,我的电话号码是西班牙语,我目前在意大利,我所在的地区是新西兰。我的联系人名单上有来自世界各地的号码,如果不是以国际格式输入,则无法猜测每个号码使用的国家代码。这假设用户联系人列表中的所有号码都来自与其所在地区设置相同的国家或当前所在的国家。我同意Jasper的观点。虽然从用户的角度来看,这是最接近手机拨号的方式。也许:用户的语言和地区设置有令人惊讶的趋势。我在意大利,我的工作地点是英国新西兰。但是,我使用的是西班牙SIM卡,所以如果我尝试拨打的号码不是国际格式,它将被解释为西班牙号码!