好吧,我这人实在是懒,不想装组件,而且也不关心太复杂的功能,就是想让用户在使用软件之前,检查下网络是否连接了,所以查找资料写了一个函数。
首先加一个简单的说明:
- 联网只代表联网,并不代表你一定能够访问指定的网址。比如你虽然连接了 Wifi,但无线路由器却没有连接到 Internet,函数会返回已经联网,但是你实际上还是访问不了。
- 只支持 Android、iOS 和 Windows 平台,到于 OSX 我大略搜索下,没找到资料,而时间又不太允许细研究,所以大家就暂时忽略吧,在 OSX 中始终返回 true(假设苹果用户都有良好的联网习惯)。
- iOS 的用户,需要引用 iOSapi.SystemConfiguration 单元,点右边的链接直接下载。当然如果下一版 Delphi 直接带的话,您可以忽略它。注意由于用 SDKTransform 翻译后,我只改动了用到的东西,有可能有些翻译仍然不太对的,我没改,大家用到自己对比 Objective C 的原始声明改下吧。
- 已知在 iOS 模拟器中,会出现AV错误,但实机测试不会
- Android 的用户,请打开读取网络状态的权限,否则会出异常提示你打开。
uses System.Classes{$IFDEF MSWINDOWS}, Wininet{$ENDIF}{$IFDEF ANDROID},
Androidapi.Helpers, Androidapi.JNI.Net, Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge{$ENDIF}
{$IFDEF IOS}, Posix.syssocket, iOSapi.SystemConfiguration,
Macapi.CoreFoundation{$ENDIF};
{$IFDEF ANDROID}
function ConnectivityManager: JConnectivityManager;
var
AObj: JObject;
begin
AObj := TAndroidHelper.Context.getSystemService
(TJContext.JavaClass.CONNECTIVITY_SERVICE);
if Assigned(AObj) then
Result := TJConnectivityManager.Wrap((AObj as ILocalObject).GetObjectID)
else
Result := nil;
end;
{$ENDIF}
{$IFDEF IOS}
function ConnectionReachabilityFlags: Cardinal;
var
addr: sockaddr;
reachable: SCNetworkReachabilityRef;
begin
Result := 0;
FillChar(addr, SizeOf(addr), 0);
addr.sa_len := SizeOf(addr);
addr.sa_family := AF_INET;
reachable := SCNetworkReachabilityCreateWithAddress
(kCFAllocatorDefault, @addr);
if Assigned(reachable) then
begin
SCNetworkReachabilityGetFlags(reachable, Result);
CFRelease(reachable);
end;
end;
{$ENDIF}
function IsInternetConnected: Boolean;
{$IFDEF ANDROID}
function CheckConnected: Boolean;
var
AMgr: JConnectivityManager;
ANetwork: JNetworkInfo;
begin
Result := false;
AMgr := ConnectivityManager;
if Assigned(AMgr) then
begin
ANetwork := AMgr.getActiveNetworkInfo;
if Assigned(ANetwork) then
Result := ANetwork.isConnected;
end;
end;
{$ENDIF}
{$IFDEF IOS}
function CheckConnected: Boolean;
begin
Result := (ConnectionReachabilityFlags and
kSCNetworkReachabilityFlagsReachable) <> 0;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
function CheckConnected: Boolean;
var
AFlags:DWORD;
begin
AFlags:=0;
Result := InternetGetConnectedState(@AFlags,0);
end;
{$ENDIF}
{$IFDEF OSX}
function CheckConnected: Boolean;
begin
Result := true;
// 我不知道怎么去检测,如果你知道,请告诉我改进
end;
{$ENDIF}
begin
Result := CheckConnected;
end;
在 Android 和 iOS 下,稍微改进下还可以检查是否是 Wifi 或移动网络连接,这个大家自己去扩展吧。
