You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中通过Locale获取+91格式电话国家码的实现方案

获取对应地区的国际电话国家码(Apple官方库实现)

嘿,这个需求很好搞定,用Apple官方框架就能实现,给你两个实用的方案,看你场景选:

方案一:基于Locale地区码映射(纯本地,无需SIM卡)

Apple的Foundation框架本身没有直接把regionCode转成电话国家码的API,但我们可以用官方语法维护一个标准的映射字典,完全符合要求:

import Foundation

func getPhoneCountryCode(from regionCode: String) -> String? {
    // 这里可以根据你需要支持的地区扩展映射表,用的是ISO 3166-1 alpha-2地区码和E.164电话国家码的标准对应关系
    let regionToCodeMap: [String: String] = [
        "IN": "+91",
        "US": "+1",
        "CN": "+86",
        "GB": "+44",
        "JP": "+81",
        "DE": "+49"
        // 按需添加更多地区即可
    ]
    return regionToCodeMap[regionCode.uppercased()]
}

// 调用示例,结合你原来的Locale代码
if let regionCode = Locale.current.regionCode {
    if let countryCode = getPhoneCountryCode(from: regionCode) {
        print("电话国家码:\(countryCode)") // 当regionCode是IN时,输出+91
    } else {
        print("暂不支持该地区的电话国家码查询")
    }
}

这个方案的好处是不需要依赖任何硬件,只要Locale设置正确就能拿到结果,适合大多数通用场景。

方案二:基于SIM卡运营商获取(更精准)

如果你的App主要针对带SIM卡的设备(比如iPhone),而且需要更精准的当前所在国家(避免Locale设置和实际地区不一致的情况),可以用CoreTelephony框架获取SIM卡的移动国家码(MCC),再转成电话国家码:

首先,记得在你的项目里导入CoreTelephony框架,然后用下面的代码:

import CoreTelephony

func getSimBasedPhoneCountryCode() -> String? {
    let networkInfo = CTTelephonyNetworkInfo()
    guard let carrier = networkInfo.subscriberCellularProvider, let mcc = carrier.mobileCountryCode else {
        return nil
    }
    // MCC和E.164电话国家码的标准映射,比如印度的MCC是404/405,都对应+91
    let mccToCodeMap: [String: String] = [
        "404": "+91",
        "405": "+91",
        "460": "+86",
        "310": "+1",
        "234": "+44"
    ]
    return mccToCodeMap[mcc]
}

// 调用示例
if let countryCode = getSimBasedPhoneCountryCode() {
    print("SIM卡对应的电话国家码:\(countryCode)")
} else {
    print("无法获取SIM卡信息或该地区未收录")
}

注意:这个方法在没有SIM卡的设备(比如WiFi版iPad、iPod Touch)上会返回nil,所以要做好容错处理。

内容的提问来源于stack exchange,提问作者Anup Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:16:34