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

获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:58:21