Samuel James
Samuel James

Reputation: 191

Is it possible to get mobile data string ie, 4G, E, 3G, 5G etc. from status bar (NSStatusBar, UIStatusBar) in xamarin / Objective C / swift

I want to know if it is possible to determine the current mobile data connection in the status bar. I know it is possible to read things such as cellular strength, wifi strength, phone battery, time etc.

You can get the current celluar strength in xamarin using:

UIStatusBarManager statusBarManager = UIApplication.SharedApplication.KeyWindow.WindowScene?.StatusBarManager;

NSObject localStatusBar = (NSObject)statusBarManager.ValueForKey(new NSString("createLocalStatusBar"));
NSObject statusBar = (NSObject)localStatusBar.ValueForKey(new NSString("statusBar"));
UIView statusBar1 = (UIView)statusBar.ValueForKey(new NSString("_statusBar"));
NSObject currentData = (NSObject)statusBar1.ValueForKey(new NSString("currentData"));
NSObject cellularEntry = (NSObject)currentData.ValueForKey(new NSString("cellularEntry"));
Number)cellularEntry.ValueForKey(new NSString("displayValue"))).Int32Value;

and in swift

if let statusBarManager = UIApplication.shared.keyWindow?.windowScene?.statusBarManager,
let localStatusBar = statusBarManager.value(forKey: "createLocalStatusBar") as? NSObject,
let statusBar = localStatusBar.value(forKey: "statusBar") as? NSObject,
let _statusBar = statusBar.value(forKey: "_statusBar") as? UIView,
let currentData = _statusBar.value(forKey: "currentData") as? NSObject,
let celluar = currentData.value(forKey: "cellularEntry") as? NSObject,
let signalStrength = celluar.value(forKey: "displayValue") as? Int {
return signalStrength

If possible I would like the result in Xamarin but if given in Object C or Swift I can try and translate that so no worries.

Upvotes: 1

Views: 542

Answers (1)

ColeX
ColeX

Reputation: 14475

We can use CoreTelephony framework to get what we want .

Try the following code

string getConnectionType()
{
    var profiles = Connectivity.ConnectionProfiles;
    if (profiles.Contains(ConnectionProfile.Cellular))
    {
        CTTelephonyNetworkInfo networkInfo = new CTTelephonyNetworkInfo();
        string carrierTypeName = networkInfo.ServiceCurrentRadioAccessTechnology.Values[0];
        if (carrierTypeName == null) return "unknown";

        if (carrierTypeName == CTRadioAccessTechnology.GPRS ||
            carrierTypeName == CTRadioAccessTechnology.Edge ||
            carrierTypeName == CTRadioAccessTechnology.CDMA1x)
            return "2G";
        if (carrierTypeName == CTRadioAccessTechnology.WCDMA ||
            carrierTypeName == CTRadioAccessTechnology.HSDPA ||
            carrierTypeName == CTRadioAccessTechnology.HSUPA ||
            carrierTypeName == CTRadioAccessTechnology.CDMAEVDORev0 ||
            carrierTypeName == CTRadioAccessTechnology.CDMAEVDORevA ||
            carrierTypeName == CTRadioAccessTechnology.CDMAEVDORevB ||
            carrierTypeName == CTRadioAccessTechnology.EHRPD)
            return "3G";
        if (carrierTypeName == CTRadioAccessTechnology.LTE)
            return "4G";

        return "5G";
    }
    return "unknown";
}

Refer to

https://stackoverflow.com/a/61327753/8187800

Upvotes: 1

Related Questions