KMM项目iOSMain模块:如何将联系人手机号转为E164格式?
iOS端KMM项目联系人手机号转E164格式解决方案
你之所以觉得麻烦,是因为只用到了CNPhoneNumber.stringValue这个格式化后的字符串,忽略了CNPhoneNumber本身的结构化数据,以及iOS原生的号码格式化API。直接解析字符串既容易出错,也没必要——系统已经帮你处理好了结构化信息。
核心思路
CNPhoneNumber本身就包含countryCode(国家电话代码,比如美国是"1")和digits(纯数字号码主体)两个属性,直接用这两个字段就能拼接出标准E164格式;如果联系人没存国家码,还可以通过设备的区域设置自动推断默认国家代码,再结合系统格式化工具生成合规的E164号码。
具体实现代码(KMM iOSMain模块)
import platform.Contacts.CNPhoneNumber import platform.Contacts.CNPhoneNumberFormatter import platform.Contacts.CNPhoneNumberFormatterStyle import platform.Foundation.Locale fun convertToE164(phoneNumber: CNPhoneNumber): String? { // 先尝试使用联系人自带的国家码 var countryCode = phoneNumber.countryCode if (countryCode.isNullOrEmpty()) { // 若没有国家码, fallback到设备当前区域对应的电话国家码 val regionCode = Locale.current.regionCode ?: return null countryCode = CNPhoneNumberFormatter.countryCodeForRegion(regionCode) ?: return null } // 使用系统格式化工具生成标准E164格式 val formatter = CNPhoneNumberFormatter() formatter.setFormattingStyle(CNPhoneNumberFormatterStyle.CNPhoneNumberFormatterStyleE164) return formatter.stringFromPhoneNumber(phoneNumber) ?: "+$countryCode${phoneNumber.digits}" }
关键注意事项
- 确保获取联系人时,你拿到的是完整的
CNPhoneNumber实例,而不是只提取stringValue——从CNContact.phoneNumbers数组中取value属性就是CNPhoneNumber对象 - 系统的
CNPhoneNumberFormatter会自动处理不同区域的号码规则,比如去除空格、括号等非数字字符,比手动拼接更可靠 - 测试场景要覆盖:带国家码的国际号码、无国家码的本地号码、特殊格式的区域号码(比如欧洲的号码)
内容的提问来源于stack exchange,提问作者Charlie Walker
相关产品推荐
相关产品推荐

