Flutter在iOS的网络请求流程大概明白了(二)

138 阅读2分钟

Flutter在iOS的网络请求流程大概明白了(一) 里说了 要使用NSURLSession进行网络请求,我需要直接使用cupertino_http库。
其实用Dio也可以,只不过需要设置httpClientAdapter为NativeAdapter 示例代码如下

Dio dio = Dio();
dio.httpClientAdapter = NativeAdapter(
cupertinoConfiguration:URLSessionConfiguration.ephemeralSessionConfiguration()
    ..allowsCellularAccess = false
    ..allowsConstrainedNetworkAccess = false
    ..allowsExpensiveNetworkAccess = false,
);

在这个示例中,我们使用了Dio库,并将其httpClientAdapter属性设置为NativeAdapter,这将底层网络请求委托给系统的NSURLSession,因此在iOS上也可以使用NSURLSession来执行网络请求。这允许我们使用Dio的高级功能进行网络请求,同时仍然能够利用底层的NSURLSession。

接下来研究socket

Dart的socket代码在socket.h 编译后在flutter/bin/cache/dart-sdk/bin/dartaotruntime
用hopper看了一下 确实在这里

这里应该是用到了FFI,还没找到

找到FFI了

看样子是这里了

 @pragma("vm:external-name", "ServerSocket_CreateBindListen")

查了一下 确定了

`vm:external-name`是一个@pragma注释,用于在Dart中为与底层本机代码的交互定义  
 Dart 函数的外部名称。这个注释通常用于 Dart FFI(Foreign Function Interface)
 中,以确保 Dart 能够正确与本机代码进行交互。

总结

流程如下:首先,有Dart代码,其中包含用于调用FFI创建Socket的部分,然后还有一些C++文件(socket_**.cc),它调用系统的Socket接口,通过FFI注释与Dart进行交互。这允许我们在Dart中创建Socket,然后在此基础上构建一层HTTP请求接口,以便进行HTTP请求。

简化流程如下:

  1. Dart代码:包括用FFI调用C++创建和使用Socket的部分。
  2. C++文件(socket_**.cc):调用系统的Socket接口,通过FFI与Dart进行交互。
  3. 在Dart中调用FFI,使用Socket。
  4. 封装一层例如Dio,HttpClient等,构建HTTP请求接口以进行HTTP请求。

这个流程允许我们在Dart中使用Socket,然后在此基础上构建HTTP请求接口,以便进行网络通信。