首页
/ React Native Webview 中实现网络配置的技术方案

React Native Webview 中实现网络配置的技术方案

2025-06-01 03:31:01作者:申梦珏Efrain

背景介绍

在移动应用开发中,Webview 是一个非常重要的组件,它允许开发者在应用中嵌入网页内容。React Native Webview 作为 React Native 生态中最流行的 Webview 组件,提供了丰富的功能来满足开发者的需求。然而,在某些特定场景下,开发者可能需要控制 Webview 的网络请求,例如通过特定服务器来过滤广告、跟踪脚本或实现其他网络内容修改功能。

问题分析

在原生浏览器或桌面环境中,配置网络服务器相对简单,但在 React Native Webview 中,这一功能并未直接提供。开发者面临的主要挑战包括:

  1. 缺乏直接配置网络的 API 接口
  2. 需要区分不同平台(iOS/Android)的实现方式
  3. 需要考虑网络认证等高级功能
  4. 需要处理不同系统版本的兼容性问题

解决方案

Android 平台实现

在 Android 平台上,可以通过修改 React Native Webview 的 Kotlin 实现代码来添加网络支持:

if (source.hasKey("network")) {
    val network = source.getMap("network")
    val networkUri = network!!.getString("uri")
    val networkProtocol = network!!.getString("protocol")
    val networkPort = network!!.getString("port")
    val networkExcludedDomain = network!!.getString("excludedDomain")!!
    
    if (WebViewFeature.isFeatureSupported(WebViewFeature.NETWORK_OVERRIDE)) {
        val pcInstance = NetworkController.getInstance()
        pcInstance?.let {
            val pxConfig = NetworkConfig.Builder()
                .addNetworkRule(networkProtocol + "://" + networkUri + ":" + networkPort)
                .addBypassRule(networkProtocol + "://" + networkExcludedDomain)
                .build()
            it.setNetworkOverride(pxConfig, Executor { command -> command?.run() }) {
                Log.e(TAG, "Failed to set network")
            }
        }
    }
}

这段代码主要做了以下几件事:

  1. 检查传入的 source 是否包含 network 配置
  2. 提取网络服务器的 URI、协议、端口和排除域名
  3. 检查设备是否支持网络覆盖功能
  4. 创建网络配置并应用到 Webview

iOS 平台实现

在 iOS 平台上,需要使用不同的 API 来实现网络功能,特别是 iOS 17 及以上版本提供了新的网络配置接口:

NSString *networkUri = [RCTConvert NSString:_source[@"network"][@"uri"]];
NSString *networkProtocol = [RCTConvert NSString:_source[@"network"][@"protocol"]];
NSString *networkPort = [RCTConvert NSString:_source[@"network"][@"port"]];
NSString *networkExcludedDomain = [RCTConvert NSString:_source[@"network"][@"excludedDomain"]];
NSString *username = [_basicAuthCredential valueForKey:@"username"];
NSString *password = [_basicAuthCredential valueForKey:@"password"];

if(networkUri) {
    if (@available(iOS 17.0, *)) {
        nw_endpoint_t endpoint = nw_endpoint_create_host([networkUri UTF8String], [networkPort UTF8String]);
        nw_network_config_t networkConfig = nil;
        
        if (networkProtocol) {
            if ([networkProtocol isEqualToString:@"http"]) {
                networkConfig = nw_network_config_create_http_connect(endpoint, nil);
            } else if ([networkProtocol isEqualToString:@"https"]) {
                nw_protocol_options_t tlsOptions = nw_tls_create_options();
                networkConfig = nw_network_config_create_http_connect(endpoint, tlsOptions);
            }
        }
        
        if (networkConfig) {
            nw_network_config_add_excluded_domain(networkConfig, [networkExcludedDomain UTF8String]);
            
            if (username && password) {
                nw_network_config_set_username_and_password(networkConfig, [username UTF8String], [password UTF8String]);
            }
            
            wkWebViewConfig.websiteDataStore.networkConfigurations = @[ networkConfig ];
        }
    }
}

iOS 实现的关键点包括:

  1. 使用 iOS 17 引入的新网络框架 API
  2. 支持 HTTP 和 HTTPS 两种网络协议
  3. 提供网络认证功能
  4. 支持排除特定域名的网络

使用方式

在 React Native 组件中使用网络配置的示例:

<WebView
  source={{
    uri: 'https://example.com',
    network: {
      protocol: Config.ENV === 'PRODUCTION' ? 'https' : 'http',
      uri: Config.MOKA_NETWORK_URL,
      port: Config.MOKA_NETWORK_PORT,
      excludedDomain: Config.MOKA_NETWORK_EXCLUDED_DOMAIN,
    },
  }}
  basicAuthCredential={{
    username: 'username',
    password: 'password',
  }}
/>

注意事项

  1. 版本兼容性:iOS 实现需要 iOS 17 及以上版本,Android 实现需要检查 WebViewFeature.NETWORK_OVERRIDE 是否支持
  2. 性能考虑:网络服务器会增加网络请求的延迟,需要评估对用户体验的影响
  3. 安全性:网络服务器将看到所有 Webview 的网络流量,需要确保网络服务器的可信度
  4. 错误处理:需要妥善处理网络配置失败的情况,提供备用方案

扩展思考

这种网络配置方案不仅可以用于广告过滤,还可以应用于以下场景:

  1. 企业应用:通过特定方式记录员工访问的网页内容
  2. 内容过滤:在家长控制类应用中过滤不适宜内容
  3. 测试环境:在开发和测试阶段模拟不同的网络环境
  4. 数据压缩:通过网络服务器对网页内容进行压缩,节省流量

总结

通过修改 React Native Webview 的底层实现,我们可以在 Android 和 iOS 平台上实现网络服务器的配置功能。这种方案虽然需要直接修改原生代码,但提供了灵活的网络控制能力,可以满足各种特殊场景的需求。开发者可以根据实际需求调整网络配置,实现广告过滤、内容修改等多种功能。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
53
468
kernelkernel
deepin linux kernel
C
22
5
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
878
517
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
336
1.1 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
180
264
cjoycjoy
一个高性能、可扩展、轻量、省心的仓颉Web框架。Rest, 宏路由,Json, 中间件,参数绑定与校验,文件上传下载,MCP......
Cangjie
87
14
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
349
381
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
612
60