写点什么

【FAQ】HarmonyOS SDK 闭源开放能力 — Network Kit

作者:HarmonyOS SDK
  • 2025-11-11
    贵州
  • 本文字数:2822 字

    阅读完需:约 9 分钟

1.问题描述:


在系统网络代理在被清除后,鸿蒙 web 组件尝试打开网页时,获取到了系统网络代理,导致网页打开失败。


解决方案:


  1. 检查网络权限配置 确保在 module.json5 配置文件中已声明必要的网络权限:



"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.GET_NETWORK_INFO"
}
]
复制代码


缺少权限可能导致网络请求被系统拦截。


  1. 调整 Web 组件属性 在 Web 组件中添加以下关键属性以增强网络访问能力:


Web({
src: 'https://example.com'
})
.domStorageAccess(true) // 启用DOM存储
.fileAccess(true) // 允许文件访问
.javaScriptAccess(true) // 启用JavaScript
复制代码


部分网页功能(如 WebSocket)需要开启特定权限。


  1. 处理代理残留问题


清除缓存:手动清除应用缓存或重启应用,避免代理配置残留。


设置自定义 UserAgent:部分网络问题可通过覆盖默认 UserAgent 解决:


Web({
src: 'https://example.com'
})
.userAgent('Mozilla/5.0 HarmonyOS-WebView')
复制代码


  1. 服务端兼容性验证


若涉及跨域请求(如开发环境调用远程 API),需服务端配置 CORS 响应头(如 Access-Control-Allow-Origin: *)。


通过 Postman 等工具直接测试接口,排除服务端问题。


  1. SDK 版本与网络配置


确保使用最新版 SDK,旧版本可能存在网络组件兼容性问题。


检查系统全局代理设置是否完全关闭(路径:系统设置 > 网络和互联网 > 代理)。


若问题仅在 Web 组件中复现,而系统浏览器正常,需重点排查组件属性配置及权限声明。开发过程中可通过 DevTools 日志(FocusedHitDataChange 类错误)定位具体失败环节。


2.问题描述:


目前有的流量管理模块https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/net-statistics里面的 api,要么是统计整个设备的,要么是统计某个应用总的,有什么办法分开统计某一个应用的蜂窝和 Wi-Fi 吗?


解决方案:


【解决方案】


固定时间分别获取网卡和蜂窝实时上行和下行流量,两个数值的差额即为每天设备的流量统计。


部分代码示例:


TypeScript
import { statistics, socket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
@State message: string = 'Statistics';

getIfaceBytes() {
// 获取指定网卡实时下行流量
statistics.getIfaceRxBytes("wlan0").then((stats: number) => {
console.log(`wlan0 down size = ${stats}`);
});

// 获取指定网卡实时上行流量
statistics.getIfaceTxBytes("wlan0").then((stats: number) => {
console.log(`wlan0 up size = ${stats}`);
});
}

getCellularBytes() {
// 获取蜂窝实时下行流量
statistics.getCellularRxBytes((error: BusinessError, stats: number) => {
if (error) {
console.error(`getCellularRxBytes err, code: ${error.code}, message: ${error.message}`);
return;
}
console.log(`cellular down size = ${stats}`);
});

// 获取蜂窝实时上行流量
statistics.getCellularTxBytes((error: BusinessError, stats: number) => {
if (error) {
console.error(`getCellularTxBytes err, code: ${error.code}, message: ${error.message}`);
return;
}
console.log(`cellular up size = ${stats}`);
});
}

build() {
RelativeContainer() {
Text(this.message)
.id('Statistics')
.fontSize($r('app.float.page_text_font_size'))
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => {
this.message = 'Welcome';
this.getIfaceBytes();
this.getCellularBytes()
})
}
.height('100%')
.width('100%')
}
}
复制代码


3.问题描述:


调用getCellularRxBytes/getCellularTxBytes接口异常,{"code":2103012,"message":"Get iface name failed"},如何解决?


解决方案:


在使用 Wi-Fi 场景下,调用 getCellularTxBytes 会出现上述异常,切换到蜂窝流量调用即可。


4.问题描述:


手动连接无网 Wi-Fi,不会弹“当前 WLAN 不可上网,是否继续使用此 WLAN”弹窗。


解决方案:


弹框只在首次连接弹出,不会重复弹出。将热点删除后重新连接,弹框会再次弹出。


5.问题描述:


系统打开 VPN 导致 ohso.request 下载接口失败,其它 RCP 接口请求可以正常使用。


解决方案:


上传下载是在独立的 SA 进程,所以走 VPN 的应用不能使用 ohso.request 接口,RCP 是在应用进程传输数据。


6.问题描述:


创建 VPN 时 Config 配置中网关地址与 VPN IP 地址是否可以不一致?


解决方案:


网关地址与 VPN 分配的 IP 地址不在同一网段,会出现路由失效的情况,设备无法通过默认网关转发数据,导致连接超时或无法访问目标网络。应保证网关地址和 VPN IP 地址在同一网段,或将网关地址置空。


7.问题描述:


调试报错码 2300023,Failed to write the received data to the disk/application.这个异常是接口超 5M 限制了吗?有什么解决方案?


解决方案:


因为 http 请求中下载文件超过 5M 的阈值导致图片过大而报错,http 发起请求的响应消息的最大字节限制默认值是 510241024,设置响应数据最大字节限制为 100M 或是采用流式传输。


【修改建议】


  • 方案一:maxLimit 修改为 100M。



http.createHttp().request(url,
{
method: http.RequestMethod.GET,
connectTimeout: 60000,
readTimeout: 60000,
maxLimit: 100 * 1024 * 1024,
},
复制代码


  • 方案二:采用流式传输。



// 在dataReceive中拼接图片数据
let imageChunks: ArrayBuffer[] = [];
httpRequest.on('dataReceive', (data: ArrayBuffer) => {
imageChunks.push(data);
console.info('收到分片,大小:' + data.byteLength + ' bytes');
});
httpRequest.on('dataEnd', () => {
// 计算总长度
let totalLength = imageChunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
let fullImage = new Uint8Array(totalLength);
// 拼接所有分片数据
let offset = 0;
for (let chunk of imageChunks) {
fullImage.set(new Uint8Array(chunk), offset);
offset += chunk.byteLength;
}
console.info('图片接收完成,总大小:' + totalLength + 'bytes');
const base64 = btoa(String.fromCharCode(...fullImage));
const imgSrc = `data:image/png;base64,${base64}`;
console.info('可用于展示的图片 src:', imgSrc);
});
复制代码


用户头像

HarmonyOS SDK

关注

HarmonyOS SDK 2022-06-16 加入

HarmonyOS SDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净、更智能、更精致、更易用的鸿蒙应用,和开发者共同成长。

评论

发布
暂无评论
【FAQ】HarmonyOS SDK 闭源开放能力 — Network Kit_HarmonyOS NEXT_HarmonyOS SDK_InfoQ写作社区