import Foundationimport CoreTelephonyfinal class CarrierMonitor { static let shared = CarrierMonitor() private init() {} func startTrace() { // 监控 CTTelephonyNetworkInfo guard let netInfoCls = objc_getClass("CTTelephonyNetworkInfo") as? AnyClass else { return } swizzle(cls: netInfoCls, originalSel: #selector(getter: CTTelephonyNetworkInfo.subscriberCellularProvider), swizzledSel: #selector(CTTelephonyNetworkInfo.trace_subscriberCellularProvider)) swizzle(cls: netInfoCls, originalSel: #selector(getter: CTTelephonyNetworkInfo.serviceSubscriberCellularProviders), swizzledSel: #selector(CTTelephonyNetworkInfo.trace_serviceSubscriberCellularProviders)) // 监控 CTCarrier guard let carrierCls = objc_getClass("CTCarrier") as? AnyClass else { return } swizzle(cls: carrierCls, originalSel: #selector(getter: CTCarrier.carrierName), swizzledSel: #selector(CTCarrier.trace_carrierName)) swizzle(cls: carrierCls, originalSel: #selector(getter: CTCarrier.mobileCountryCode), swizzledSel: #selector(CTCarrier.trace_mobileCountryCode)) swizzle(cls: carrierCls, originalSel: #selector(getter: CTCarrier.mobileNetworkCode), swizzledSel: #selector(CTCarrier.trace_mobileNetworkCode)) } private func swizzle(cls: AnyClass, originalSel: Selector, swizzledSel: Selector) { guard let origMethod = class_getInstanceMethod(cls, originalSel), let newMethod = class_getInstanceMethod(cls, swizzledSel) else { return } let didAddMethod = class_addMethod(cls, originalSel, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)) if didAddMethod { class_replaceMethod(cls, swizzledSel, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)) } else { method_exchangeImplementations(origMethod, newMethod) } }}// MARK: - CTTelephonyNetworkInfo 扩展extension CTTelephonyNetworkInfo { @objc func trace_subscriberCellularProvider() -> CTCarrier? { let carrier = self.trace_subscriberCellularProvider() print(""" ⚠️【运营商API触发】subscriberCellularProvider(单卡运营商) 调用栈: \(Thread.callStackSymbols.joined(separator: "\n")) """) return carrier } @objc func trace_serviceSubscriberCellularProviders() -> [String: CTCarrier]? { let map = self.trace_serviceSubscriberCellularProviders() print(""" ⚠️【运营商API触发】serviceSubscriberCellularProviders(双卡运营商) 调用栈: \(Thread.callStackSymbols.joined(separator: "\n")) """) return map }}// MARK: - CTCarrier 扩展extension CTCarrier { @objc func trace_carrierName() -> String? { let name = self.trace_carrierName() print(""" ⚠️【运营商API触发】读取 carrierName 调用栈: \(Thread.callStackSymbols.joined(separator: "\n")) """) return name } @objc func trace_mobileCountryCode() -> String? { let mcc = self.trace_mobileCountryCode() print(""" ⚠️【运营商API触发】读取 mobileCountryCode(MCC) 调用栈: \(Thread.callStackSymbols.joined(separator: "\n")) """) return mcc } @objc func trace_mobileNetworkCode() -> String? { let mnc = self.trace_mobileNetworkCode() print(""" ⚠️【运营商API触发】读取 mobileNetworkCode(MNC) 调用栈: \(Thread.callStackSymbols.joined(separator: "\n")) """) return mnc }}