获取iPhone含eSIM的所有SIM号码及Swift实现方案问询
关于iPhone SIM(含eSIM)号码展示的解决方案
苹果是否允许直接获取SIM号码?
苹果不允许第三方应用直接读取SIM(包括eSIM)的电话号码,因为这属于用户敏感隐私数据,受iOS隐私政策严格限制。CoreTelephony等系统框架仅提供运营商名称、MCC/MNC等非敏感元数据的获取能力,没有暴露获取SIM号码的API。
可行的替代方案
由于无法直接获取号码,可通过以下方式实现注册场景的需求:
- 引导用户手动输入号码:这是最直接合规的方式,搭配输入验证确保格式正确。
- 从通讯录选择号码:利用Contacts框架让用户从通讯录中选号,避免手动输入的繁琐。
- 识别SIM卡标识辅助选择:获取SIM(含eSIM)的运营商、计划名称等信息,展示为下拉选项,用户选择后手动输入对应号码。
Swift代码实现
1. 获取所有SIM(含eSIM)的运营商及计划信息
该代码可获取设备上所有实体SIM和eSIM的基本标识信息,用于下拉选项展示:
import UIKit import CoreTelephony class SIMCardManager { static func getAllSIMDetails() -> [(identifier: String, carrierName: String, planName: String?)] { let networkInfo = CTTelephonyNetworkInfo() var simDetails = [(identifier: String, carrierName: String, planName: String?)]() // 获取所有SIM卡的运营商信息(支持多SIM/ eSIM) if let serviceProviders = networkInfo.serviceSubscriberCellularProviders { for (serviceId, provider) in serviceProviders { let carrierName = provider.carrierName ?? "未知运营商" // 获取eSIM计划名称(实体SIM可能为空) let planManager = CTCellularPlanManager() let planName = planManager.plans.first { $0.serviceIdentifier == serviceId }?.planName simDetails.append((identifier: serviceId, carrierName: carrierName, planName: planName)) } } return simDetails } } // 使用示例 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let simList = SIMCardManager.getAllSIMDetails() for sim in simList { print("SIM标识: \(sim.identifier)") print("运营商: \(sim.carrierName)") print("计划名称: \(sim.planName ?? "无")") print("---") } // 可将simList转换为下拉选项的数据源,比如UIPickerView或UITableView的数据源 } }
2. 从通讯录选择号码的实现
如果需要让用户从通讯录选号,可使用Contacts框架:
import UIKit import ContactsUI class ContactPickerViewController: UIViewController, CNContactPickerDelegate { func showContactPicker() { let contactPicker = CNContactPickerViewController() contactPicker.delegate = self // 指定只选择电话号码 contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey] present(contactPicker, animated: true) } func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) { guard let phoneNumber = contactProperty.value as? CNPhoneNumber else { return } let formattedNumber = phoneNumber.stringValue print("选择的号码: \(formattedNumber)") // 将号码填充到注册输入框 dismiss(animated: true) } func contactPickerDidCancel(_ picker: CNContactPickerViewController) { dismiss(animated: true) } }
注意事项
- 使用Contacts框架时,需要在
Info.plist中添加NSContactsUsageDescription权限描述,说明访问通讯录的用途。 - 所有涉及用户隐私的操作必须明确告知用户,遵循iOS隐私规范。
内容的提问来源于stack exchange,提问作者DSRawat
相关产品推荐
相关产品推荐

