RAITON
RAITON

Reputation: 375

Signal strength, CID, LAC, etc.) on iOS for an internal Flutter app

I am developing an internal mobile app in Flutter and need to retrieve detailed cellular network information such as signal strength (dBm), cell ID (CID), location area code (LAC), and more on iOS. I understand that iOS restricts access to some of this information through public APIs, but since this app is for internal use only, I am looking for any possible solution.

Here is the Swift code I am using to get network information:

import Foundation
import CoreTelephony

class RfSignalStrengthImpl: RfSignalStrengthApi {
    func getCellularSignalStrength(completion: @escaping (Result<CellularSignalStrength, Error>) -> Void) {
        let networkInfo = CTTelephonyNetworkInfo()

        guard let carrier = networkInfo.serviceSubscriberCellularProviders?.values.first else {
            completion(.failure(NSError(domain: "com.xxxx.yyyy", code: 0, userInfo: [NSLocalizedDescriptionKey: "Carrier not found"])))
            return
        }

        let carrierName = carrier.carrierName ?? "Unknown"
        let mobileCountryCode = carrier.mobileCountryCode ?? "Unknown"
        let mobileNetworkCode = carrier.mobileNetworkCode ?? "Unknown"
        let radioAccessTechnology = networkInfo.serviceCurrentRadioAccessTechnology?.values.first ?? "Unknown"

        var connectionStatus = "Unknown"
        if let radioTech = networkInfo.currentRadioAccessTechnology {
            switch radioTech {
            case CTRadioAccessTechnologyGPRS:
                connectionStatus = "GPRS"
            case CTRadioAccessTechnologyEdge:
                connectionStatus = "EDGE"
            case CTRadioAccessTechnologyCDMA1x:
                connectionStatus = "CDMA1x"
            case CTRadioAccessTechnologyCDMAEVDORev0:
                connectionStatus = "EvDo Rev. 0"
            case CTRadioAccessTechnologyCDMAEVDORevA:
                connectionStatus = "EvDo Rev. A"
            case CTRadioAccessTechnologyHSDPA:
                connectionStatus = "HSDPA"
            case CTRadioAccessTechnologyHSUPA:
                connectionStatus = "HSUPA"
            case CTRadioAccessTechnologyLTE:
                connectionStatus = "LTE"
            default:
                connectionStatus = "Unknown"
            }
        }

        let duplexMode = "Unknown"
        let level: Int64 = -1
        let dbm: Int64 = -1
        let rssi: Int64 = -1
        let rsrq: Int64 = -1

        let cid: Int64 = -1
        let lac: Int64 = -1

        let response = CellularSignalStrength(
            level: level,
            dbm: dbm,
            rssi: rssi,
            rsrq: rsrq,
            cid: cid,
            lac: lac,
            carrierName: carrierName,
            mobileCountryCode: mobileCountryCode,
            mobileNetworkCode: mobileNetworkCode,
            radioAccessTechnology: radioAccessTechnology,
            connectionStatus: connectionStatus,
            duplexMode: duplexMode
        )
        completion(.success(response))
    }
}

However, the output I get is:

{
    level: -1,
    dbm: -1,
    rssi: -1,
    rsrq: -1,
    cid: -1,
    lac: -1,
    carrierName: --,
    mobileCountryCode: 65535,
    mobileNetworkCode: 65535,
    radioAccessTechnology: CTRadioAccessTechnologyLTE,
    connectionStatus: LTE,
    duplexMode: Unknown
}

As you can see, many of the fields have placeholder values or incorrect data.

Question:

How can I retrieve detailed cellular network information on iOS for an internal app? Are there any methods, public or private APIs, or workarounds to get this data, considering the app will not be distributed via the App Store?

I know that CoreTelephony is deprecated, but I don't know what the replacement is or how to use it today. Any guidance would be appreciated.

Upvotes: 0

Views: 177

Answers (0)

Related Questions