首页 文章

处理国际电话#和不正确的联系簿格式

提问于
浏览
5

我一直在推迟发布这个问题,因为我必须处理几个场景 . 基本上,我们的应用程序使用Twilio将带有验证码的短信发送到用户的手机,以确认他们实际拥有该设备 . 我们很高兴Twilio作为一个整体可以接受国际电话号码 . 然而,本地设备上有几个巨大的问题,目前我们认为我们现在应该只支持/保证美国的电话#s . 但这就是我问这个问题的原因,看看你是否可以指出我更好的方向 .

因此问题存在以下几种情况:大多数用户不能解决iOS联系人手册中的所有垃圾字符,例如 ()#+*- 和空白 . 然后我们在已清理的 NSString 的正面添加1,这使得手机#现在成为美国手机号码,这对其他国家/地区的其他用户来说是不正确的 . 我们的大多数用户都是美国公民,但是用户和国家代码正确地格式化他们的联系人,我们必须忽略它,因为不幸的是大多数用户都没有正确格式化 .

我不相信获得设备的语言环境也是最佳解决方案 . 当然,必须有一种更简单,更好的方法来做到这一点,而不是对用户的位置做出任何假设?如果是的话,请你发一些建议吗?

编辑:我接受了奖励赏金的建议,这是我最终提出的:

NSDictionary *dictCodes = [NSDictionary dictionaryWithObjectsAndKeys:@"972", @"IL",
                                       @"93", @"AF", @"355", @"AL", @"213", @"DZ", @"1", @"AS",
                                       @"376", @"AD", @"244", @"AO", @"1", @"AI", @"1", @"AG",
                                       @"54", @"AR", @"374", @"AM", @"297", @"AW", @"61", @"AU",
                                       @"43", @"AT", @"994", @"AZ", @"1", @"BS", @"973", @"BH",
                                       @"880", @"BD", @"1", @"BB", @"375", @"BY", @"32", @"BE",
                                       @"501", @"BZ", @"229", @"BJ", @"1", @"BM", @"975", @"BT",
                                       @"387", @"BA", @"267", @"BW", @"55", @"BR", @"246", @"IO",
                                       @"359", @"BG", @"226", @"BF", @"257", @"BI", @"855", @"KH",
                                       @"237", @"CM", @"1", @"CA", @"238", @"CV", @"345", @"KY",
                                       @"236", @"CF", @"235", @"TD", @"56", @"CL", @"86", @"CN",
                                       @"61", @"CX", @"57", @"CO", @"269", @"KM", @"242", @"CG",
                                       @"682", @"CK", @"506", @"CR", @"385", @"HR", @"53", @"CU",
                                       @"537", @"CY", @"420", @"CZ", @"45", @"DK", @"253", @"DJ",
                                       @"1", @"DM", @"1", @"DO", @"593", @"EC", @"20", @"EG",
                                       @"503", @"SV", @"240", @"GQ", @"291", @"ER", @"372", @"EE",
                                       @"251", @"ET", @"298", @"FO", @"679", @"FJ", @"358", @"FI",
                                       @"33", @"FR", @"594", @"GF", @"689", @"PF", @"241", @"GA",
                                       @"220", @"GM", @"995", @"GE", @"49", @"DE", @"233", @"GH",
                                       @"350", @"GI", @"30", @"GR", @"299", @"GL", @"1", @"GD",
                                       @"590", @"GP", @"1", @"GU", @"502", @"GT", @"224", @"GN",
                                       @"245", @"GW", @"595", @"GY", @"509", @"HT", @"504", @"HN",
                                       @"36", @"HU", @"354", @"IS", @"91", @"IN", @"62", @"ID",
                                       @"964", @"IQ", @"353", @"IE", @"972", @"IL", @"39", @"IT",
                                       @"1", @"JM", @"81", @"JP", @"962", @"JO", @"77", @"KZ",
                                       @"254", @"KE", @"686", @"KI", @"965", @"KW", @"996", @"KG",
                                       @"371", @"LV", @"961", @"LB", @"266", @"LS", @"231", @"LR",
                                       @"423", @"LI", @"370", @"LT", @"352", @"LU", @"261", @"MG",
                                       @"265", @"MW", @"60", @"MY", @"960", @"MV", @"223", @"ML",
                                       @"356", @"MT", @"692", @"MH", @"596", @"MQ", @"222", @"MR",
                                       @"230", @"MU", @"262", @"YT", @"52", @"MX", @"377", @"MC",
                                       @"976", @"MN", @"382", @"ME", @"1", @"MS", @"212", @"MA",
                                       @"95", @"MM", @"264", @"NA", @"674", @"NR", @"977", @"NP",
                                       @"31", @"NL", @"599", @"AN", @"687", @"NC", @"64", @"NZ",
                                       @"505", @"NI", @"227", @"NE", @"234", @"NG", @"683", @"NU",
                                       @"672", @"NF", @"1", @"MP", @"47", @"NO", @"968", @"OM",
                                       @"92", @"PK", @"680", @"PW", @"507", @"PA", @"675", @"PG",
                                       @"595", @"PY", @"51", @"PE", @"63", @"PH", @"48", @"PL",
                                       @"351", @"PT", @"1", @"PR", @"974", @"QA", @"40", @"RO",
                                       @"250", @"RW", @"685", @"WS", @"378", @"SM", @"966", @"SA",
                                       @"221", @"SN", @"381", @"RS", @"248", @"SC", @"232", @"SL",
                                       @"65", @"SG", @"421", @"SK", @"386", @"SI", @"677", @"SB",
                                       @"27", @"ZA", @"500", @"GS", @"34", @"ES", @"94", @"LK",
                                       @"249", @"SD", @"597", @"SR", @"268", @"SZ", @"46", @"SE",
                                       @"41", @"CH", @"992", @"TJ", @"66", @"TH", @"228", @"TG",
                                       @"690", @"TK", @"676", @"TO", @"1", @"TT", @"216", @"TN",
                                       @"90", @"TR", @"993", @"TM", @"1", @"TC", @"688", @"TV",
                                       @"256", @"UG", @"380", @"UA", @"971", @"AE", @"44", @"GB",
                                       @"1", @"US", @"598", @"UY", @"998", @"UZ", @"678", @"VU",
                                       @"681", @"WF", @"967", @"YE", @"260", @"ZM", @"263", @"ZW",
                                       @"591", @"BO", @"673", @"BN", @"61", @"CC", @"243", @"CD",
                                       @"225", @"CI", @"500", @"FK", @"44", @"GG", @"379", @"VA",
                                       @"852", @"HK", @"98", @"IR", @"44", @"IM", @"44", @"JE",
                                       @"850", @"KP", @"82", @"KR", @"856", @"LA", @"218", @"LY",
                                       @"853", @"MO", @"389", @"MK", @"691", @"FM", @"373", @"MD",
                                       @"258", @"MZ", @"970", @"PS", @"872", @"PN", @"262", @"RE",
                                       @"7", @"RU", @"590", @"BL", @"290", @"SH", @"1", @"KN",
                                       @"1", @"LC", @"590", @"MF", @"508", @"PM", @"1", @"VC",
                                       @"239", @"ST", @"252", @"SO", @"47", @"SJ", @"963", @"SY",
                                       @"886", @"TW", @"255", @"TZ", @"670", @"TL", @"58", @"VE",
                                       @"84", @"VN", @"1", @"VG", @"1", @"VI", nil];

NSLocale *locale = [NSLocale currentLocale];
NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];
NSString *callingCode = [dictCodes objectForKey:countryCode];

NSCharacterSet *validCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"+0123456789"]invertedSet];

for (NSString *sub in mutablePhonesArray)
{
    NSString *newString = [[sub componentsSeparatedByCharactersInSet:validCharacters]componentsJoinedByString:@""];

    NSString *newString2 = newString;

    if (![newString hasPrefix:@"+"])
    {
        newString2 = [NSString stringWithFormat:@"+%@%@",callingCode,newString];
    }

    NSString *substring = [newString2 substringFromIndex:1];
    NSString *removeExtraPlusSigns = [substring stringByReplacingOccurrencesOfString:@"+" withString:@""];
    NSString *finalPhone = [NSString stringWithFormat:@"+%@",removeExtraPlusSigns];

    [newPhoneArray addObject:finalPhone];
}

3 回答

  • 0

    要查找调用前缀,请首先通过 NSLocale 类访问用户当前区域设置 . 请注意,这不需要任何其他权限或私有API .

    NSLocale *locale = [NSLocale currentLocale];
    NSString *countryCode = [locale objectForKey: NSLocaleCountryCode];
    NSString *callingCode = [dictCodes objectForKey:countryCode];
    

    使用国家代码从所有ISO国家代码的硬编码 NSDictionary 以及我在下面包含的相应呼叫代码中检索相关的呼叫代码 .

    NSDictionary *dictCodes = [NSDictionary dictionaryWithObjectsAndKeys:@"972", @"IL",
                                      @"93", @"AF", @"355", @"AL", @"213", @"DZ", @"1", @"AS",
                                      @"376", @"AD", @"244", @"AO", @"1", @"AI", @"1", @"AG",
                                      @"54", @"AR", @"374", @"AM", @"297", @"AW", @"61", @"AU",
                                      @"43", @"AT", @"994", @"AZ", @"1", @"BS", @"973", @"BH",
                                      @"880", @"BD", @"1", @"BB", @"375", @"BY", @"32", @"BE",
                                      @"501", @"BZ", @"229", @"BJ", @"1", @"BM", @"975", @"BT",
                                      @"387", @"BA", @"267", @"BW", @"55", @"BR", @"246", @"IO",
                                      @"359", @"BG", @"226", @"BF", @"257", @"BI", @"855", @"KH",
                                      @"237", @"CM", @"1", @"CA", @"238", @"CV", @"345", @"KY",
                                      @"236", @"CF", @"235", @"TD", @"56", @"CL", @"86", @"CN",
                                      @"61", @"CX", @"57", @"CO", @"269", @"KM", @"242", @"CG",
                                      @"682", @"CK", @"506", @"CR", @"385", @"HR", @"53", @"CU",
                                      @"537", @"CY", @"420", @"CZ", @"45", @"DK", @"253", @"DJ",
                                      @"1", @"DM", @"1", @"DO", @"593", @"EC", @"20", @"EG",
                                      @"503", @"SV", @"240", @"GQ", @"291", @"ER", @"372", @"EE",
                                      @"251", @"ET", @"298", @"FO", @"679", @"FJ", @"358", @"FI",
                                      @"33", @"FR", @"594", @"GF", @"689", @"PF", @"241", @"GA",
                                      @"220", @"GM", @"995", @"GE", @"49", @"DE", @"233", @"GH",
                                      @"350", @"GI", @"30", @"GR", @"299", @"GL", @"1", @"GD",
                                      @"590", @"GP", @"1", @"GU", @"502", @"GT", @"224", @"GN",
                                      @"245", @"GW", @"595", @"GY", @"509", @"HT", @"504", @"HN",
                                      @"36", @"HU", @"354", @"IS", @"91", @"IN", @"62", @"ID",
                                      @"964", @"IQ", @"353", @"IE", @"972", @"IL", @"39", @"IT",
                                      @"1", @"JM", @"81", @"JP", @"962", @"JO", @"77", @"KZ",
                                      @"254", @"KE", @"686", @"KI", @"965", @"KW", @"996", @"KG",
                                      @"371", @"LV", @"961", @"LB", @"266", @"LS", @"231", @"LR",
                                      @"423", @"LI", @"370", @"LT", @"352", @"LU", @"261", @"MG",
                                      @"265", @"MW", @"60", @"MY", @"960", @"MV", @"223", @"ML",
                                      @"356", @"MT", @"692", @"MH", @"596", @"MQ", @"222", @"MR",
                                      @"230", @"MU", @"262", @"YT", @"52", @"MX", @"377", @"MC",
                                      @"976", @"MN", @"382", @"ME", @"1", @"MS", @"212", @"MA",
                                      @"95", @"MM", @"264", @"NA", @"674", @"NR", @"977", @"NP",
                                      @"31", @"NL", @"599", @"AN", @"687", @"NC", @"64", @"NZ",
                                      @"505", @"NI", @"227", @"NE", @"234", @"NG", @"683", @"NU",
                                      @"672", @"NF", @"1", @"MP", @"47", @"NO", @"968", @"OM",
                                      @"92", @"PK", @"680", @"PW", @"507", @"PA", @"675", @"PG",
                                      @"595", @"PY", @"51", @"PE", @"63", @"PH", @"48", @"PL",
                                      @"351", @"PT", @"1", @"PR", @"974", @"QA", @"40", @"RO",
                                      @"250", @"RW", @"685", @"WS", @"378", @"SM", @"966", @"SA",
                                      @"221", @"SN", @"381", @"RS", @"248", @"SC", @"232", @"SL",
                                      @"65", @"SG", @"421", @"SK", @"386", @"SI", @"677", @"SB",
                                      @"27", @"ZA", @"500", @"GS", @"34", @"ES", @"94", @"LK",
                                      @"249", @"SD", @"597", @"SR", @"268", @"SZ", @"46", @"SE",
                                      @"41", @"CH", @"992", @"TJ", @"66", @"TH", @"228", @"TG",
                                      @"690", @"TK", @"676", @"TO", @"1", @"TT", @"216", @"TN",
                                      @"90", @"TR", @"993", @"TM", @"1", @"TC", @"688", @"TV",
                                      @"256", @"UG", @"380", @"UA", @"971", @"AE", @"44", @"GB",
                                      @"1", @"US", @"598", @"UY", @"998", @"UZ", @"678", @"VU",
                                      @"681", @"WF", @"967", @"YE", @"260", @"ZM", @"263", @"ZW",
                                      @"591", @"BO", @"673", @"BN", @"61", @"CC", @"243", @"CD",
                                      @"225", @"CI", @"500", @"FK", @"44", @"GG", @"379", @"VA",
                                      @"852", @"HK", @"98", @"IR", @"44", @"IM", @"44", @"JE",
                                      @"850", @"KP", @"82", @"KR", @"856", @"LA", @"218", @"LY",
                                      @"853", @"MO", @"389", @"MK", @"691", @"FM", @"373", @"MD",
                                      @"258", @"MZ", @"970", @"PS", @"872", @"PN", @"262", @"RE",
                                      @"7", @"RU", @"590", @"BL", @"290", @"SH", @"1", @"KN",
                                      @"1", @"LC", @"590", @"MF", @"508", @"PM", @"1", @"VC",
                                      @"239", @"ST", @"252", @"SO", @"47", @"SJ", @"963", @"SY",
                                      @"886", @"TW", @"255", @"TZ", @"670", @"TL", @"58", @"VE",
                                      @"84", @"VN", @"1", @"VG", @"1", @"VI", nil];
    
  • 2

    Twilio福音传教士在这里 .

    您可以查看使用libphonenumber . 它有一个非常好的电话号码解析器,可以让你恢复E164格式的数字 .

    希望有所帮助 .

  • 4

    我不能发表评论所以我会回答 .

    这正是我想要的 . 这篇文章值得更多关注 .

    警告:无需担心号码长度,Twilio应该能够捕获每个无效的电话号码(除非你想阻止服务器呼叫) .

    一个问题:如果用户没有包含符号,即1-815-555-4387,则该方法添加额外的1而不是仅仅,检查电话号码长度,如此 .

    if (newString.length > 10 && ![newString hasPrefix:@"+"]) {
    //                Add the plus and get on with it.
        return [@"+" stringByAppendingString:newString];
    }
    

    我唯一担心的是,如果您根据联系人中的电话号码匹配用户,则在检索联系人时必须对此进行反向工程 .

    所以我相信,你能做的最好的事情是假设任何10位数字作为国家号码,并添加前缀 .

    //Fetch all Contacts   
           phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:
                                [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                               componentsJoinedByString:@""];
    
                if (phoneNumber.length == 10)
                {
    //This is the original answer method
                phoneNumber = [self formatPhoneNumberForCountry:phoneNumber];
                }
    
     if (![phoneNumber hasPrefix:@"+"])
                {
     //Because I stripped off the + to begin with. 
                    phoneNumber = [@"+" stringByAppendingString:phoneNumber];
                }
    

相关问题