Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 67 additions & 16 deletions src/ios/CDVConnection.m
Original file line number Diff line number Diff line change
Expand Up @@ -60,34 +60,34 @@ - (NSString*)w3cConnectionTypeFor:(CDVReachability*)reachability
return @"none";
} else {
if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) {
CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
NSString* radioAccessTechnology = [self currentRadioAccessTechnology];
if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
return @"2g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
return @"2g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
return @"3g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
return @"4g";
// 5G available since iOS 14.1
} else if (@available(iOS 14.1, *)) {
if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNRNSA]) {
if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyNRNSA]) {
return @"5g";
} else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNR]) {
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyNR]) {
return @"5g";
}
}
Expand All @@ -109,6 +109,47 @@ - (NSString*)w3cConnectionTypeFor:(CDVReachability*)reachability
}
}

- (NSString*)currentRadioAccessTechnology
{
CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];

if (@available(iOS 12.0, *)) {
// iOS 12+ exposes Radio Access Technology per cellular service (multi-SIM capable)
NSDictionary<NSString*, NSString*> *serviceCurrentRadioAccessTechnology = telephonyInfo.serviceCurrentRadioAccessTechnology;
if (serviceCurrentRadioAccessTechnology.count == 0) {
return nil;
}

NSString *currentRadioAccessTechnology = nil;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
if (@available(iOS 13.0, *)) {
// Prefer the Radio Access Technology for the currently active data service when available.
// This is the most likely to reflect the actual network type used for data connectivity.
NSString *dataServiceIdentifier = telephonyInfo.dataServiceIdentifier;

if (dataServiceIdentifier.length > 0) {
currentRadioAccessTechnology = serviceCurrentRadioAccessTechnology[dataServiceIdentifier];
}
}
#endif
if (!currentRadioAccessTechnology) {
// Deterministic fallback for iOS 12 (or missing data service identifier)
// Get the Radio Access Technology for the first available cellular service, sorted by service identifier.
NSArray<NSString*> *sortedKeys = [[serviceCurrentRadioAccessTechnology allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSString *firstKey = sortedKeys.firstObject;
currentRadioAccessTechnology = firstKey != nil ? serviceCurrentRadioAccessTechnology[firstKey] : nil;
}

return currentRadioAccessTechnology;
}

// Fallback for iOS 11 and earlier, which only supports a single Radio Access Technology.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return telephonyInfo.currentRadioAccessTechnology;
#pragma clang diagnostic pop
}

- (BOOL)isCellularConnection:(NSString*)theConnectionType
{
return [theConnectionType isEqualToString:@"2g"] ||
Expand Down Expand Up @@ -160,8 +201,18 @@ - (void)pluginInitialize
[self.internetReach startNotifier];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionType:)
name:kReachabilityChangedNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionType:)
name:CTRadioAccessTechnologyDidChangeNotification object:nil];
if (@available(iOS 12.0, *)) {
// iOS 12+ replacement for CTRadioAccessTechnologyDidChangeNotification.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionType:)
name:CTServiceRadioAccessTechnologyDidChangeNotification object:nil];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// iOS 11 fallback to keep backward compatibility.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionType:)
name:CTRadioAccessTechnologyDidChangeNotification object:nil];
#pragma clang diagnostic pop
}
if (UIApplicationDidEnterBackgroundNotification && UIApplicationWillEnterForegroundNotification) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil];
Expand Down
Loading