因为2G网络实在是慢,所以在我们的App中,如果用户使用 2G 网络,App 的反应可能会比较缓慢,所以,我们希望判断一下网络的类型,以便做一些策略处理。
下面提供的函数是我根据搜索到的资料编写的一个函数,注意 Delphi 自带的 iOSApi.CoreTelephony 单元中,CTTelphonyNetworkInfo 缺少了一个函数,所以需要我们将其复制到我们工程目录下,加入该函数:
CTTelephonyNetworkInfo = interface(NSObject)
['{F75CE940-A78E-4C64-812E-0576386B582D}']
function subscriberCellularProvider: CTCarrier; cdecl;
procedure setSubscriberCellularProviderDidUpdateNotifier(Handler: TCellularProviderNotifier); cdecl;
function currentRadioAccessTechnology:NSString;cdecl;//<--加入这一行
end;至于剩下的就好说了:
function GetNetType: TNetType;
{$IFDEF ANDROID}
function AndroidNetType: TNetType;
var
AMgr: JConnectivityManager;
ANetwork: JNetworkInfo;
AType: Integer;
ASubName: String;
begin
Result := TNetType.Other;
AMgr := ConnectivityManager;
if Assigned(AMgr) then
begin
ANetwork := AMgr.getActiveNetworkInfo;
if Assigned(ANetwork) then
begin
AType := ANetwork.getType;
if AType = TJConnectivityManager.JavaClass.TYPE_BLUETOOTH then
Result := TNetType.Bluetooth
else if AType = TJConnectivityManager.JavaClass.TYPE_ETHERNET then
Result := TNetType.Ethernet
else if AType = TJConnectivityManager.JavaClass.TYPE_WIFI then
Result := TNetType.Wifi
else if AType = TJConnectivityManager.JavaClass.TYPE_MOBILE then
begin
AType := TelephonyManager.getNetworkType;
if (AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_1xRTT) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_CDMA) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_EDGE) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_GPRS) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_IDEN) then
Result := TNetType.Mobile2G
else if (AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_UMTS) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_EVDO_0) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_EVDO_A) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_EVDO_B) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_HSDPA) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_HSUPA) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_HSPA) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_EHRPD) or
(AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_HSPAP) then
Result := TNetType.Mobile3G
else if (AType = TJTelephonyManager.JavaClass.NETWORK_TYPE_LTE) then
Result := TNetType.Mobile4G
else
begin
ASubName := UpperCase(JStringToString(ANetwork.getSubtypeName));
if (ASubName = 'TD-SCDMA') or (ASubName = 'WCDMA') or
(ASubName = 'CDMA2000') then
Result := TNetType.Mobile3G;
end;
end;
end;
end;
end;
{$ENDIF}
{$IFDEF IOS}
function iOSNetType: TNetType;
var
ANetInfo: CTTelephonyNetworkInfo;
AName: String;
begin
if (ConnectionReachabilityFlags and kSCNetworkReachabilityFlagsIsWWAN) <> 0
then
begin
ANetInfo := TCTTelephonyNetworkInfo.Create;
AName := UpperCase(Copy(NSStrToStr(ANetInfo.currentRadioAccessTechnology),
24, MaxInt));
if (AName = 'GPRS') or (AName = 'EDGE') or (AName = 'CDMA1X') then
Result := TNetType.Mobile2G
else if (AName = 'WCDMA') or (AName = 'HSDPA') or (AName = 'HSUPA') or
(AName = 'CDMAEVDOREV0') or (AName = 'CDMAEVDOREVA') or
(AName = 'CDMAEVDOREVB') or (AName = 'HRPD') then
Result := TNetType.Mobile3G
else if (AName = 'LTE') then
Result := TNetType.MobileLTE
else
Result := TNetType.Other;
end
else
Result := TNetType.Wifi
end;
{$ENDIF}
begin
if IsInternetConnected then
begin
{$IFDEF ANDROID}
Result := AndroidNetType;
{$ENDIF}
{$IFDEF IOS}
Result := iOSNetType;
{$ENDIF}
{$IFDEF MSWINDOWS}
Result := TNetType.Other;
{$ENDIF}
end
else
Result := TNetType.None;
end;TNetType 是一个枚举类型,列出了连接到 Internet 的网络类型,自己 定义下。
另外,这个需要里面的一些函数,请参考以前的 [FMX] 在应用中检测是否已经联网 中的实现
