首页
社区
课程
招聘
[原创]【FAQ】HarmonyOS SDK 闭源开放能力 — Network Kit
发表于: 2025-11-11 16:12 2437

[原创]【FAQ】HarmonyOS SDK 闭源开放能力 — Network Kit

2025-11-11 16:12
2437

1.问题描述:

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

解决方案:

  1. 检查网络权限配置 确保在 module.json5 配置文件中已声明必要的网络权限:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"requestPermissions": [
 
  {
 
    "name": "ohos.permission.INTERNET"
 
  },
 
  {
 
    "name": "ohos.permission.GET_NETWORK_INFO"
 
  }
 
]

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

  1. 调整Web组件属性 在Web组件中添加以下关键属性以增强网络访问能力:
1
2
3
4
5
6
7
8
9
10
11
Web({
 
  src: '6c4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2P5r3q4E0M7r3I4W2i4K6u0W2j5$3!0E0i4K6t1%4
 
})
 
.domStorageAccess(true)  // 启用DOM存储
 
.fileAccess(true)        // 允许文件访问
 
.javaScriptAccess(true)  // 启用JavaScript

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

  1. 处理代理残留问题

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

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

1
2
3
4
5
6
7
Web({
 
  src: '13eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2P5r3q4E0M7r3I4W2i4K6u0W2j5$3!0E0i4K6t1%4
 
})
 
.userAgent('Mozilla/5.0 HarmonyOS-WebView')
  1. 服务端兼容性验证

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

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

  1. SDK版本与网络配置

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

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

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

2.问题描述:

目前有的流量管理模块506K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3L8X3g2@1i4K6u0V1M7%4c8S2N6r3W2K6N6r3W2U0M7#2!0q4z5g2)9^5y4#2)9^5b7#2!0q4z5g2)9&6c8q4!0m8x3W2!0q4y4#2)9&6b7g2)9^5y4r3q4H3K9g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4!0m8y4W2)9^5x3g2!0q4y4q4!0n7z5g2)9^5z5q4!0q4y4W2)9&6z5q4!0m8c8W2!0q4y4#2!0n7b7W2)9&6c8W2!0q4z5q4!0m8c8g2!0m8x3g2!0q4y4W2)9&6y4g2!0n7y4q4!0q4y4q4!0n7z5q4!0m8b7g2!0q4z5q4!0m8c8g2!0n7c8g2!0q4y4g2!0m8y4q4)9^5y4#2!0q4y4#2)9&6b7g2)9^5y4q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4!0m8y4W2)9^5x3g2!0q4y4q4!0n7z5g2)9^5z5q4!0q4y4W2)9&6z5q4!0m8c8W2!0q4y4#2!0n7b7W2)9&6c8W2!0q4z5q4!0m8c8g2!0m8x3g2!0q4y4W2)9&6c8W2)9&6x3q4!0q4y4q4!0n7z5q4!0m8b7g2!0q4y4g2!0n7b7g2)9&6y4q4!0q4y4#2)9&6y4q4!0m8z5q4!0q4y4W2)9^5x3q4!0n7b7W2!0q4y4#2)9&6b7g2)9^5y4q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4W2)9&6b7#2)9^5z5g2!0q4y4q4!0n7b7W2)9^5x3q4!0q4y4q4!0n7z5g2)9^5z5q4!0q4y4g2)9^5b7g2)9&6c8g2!0q4y4W2!0n7x3#2)9&6y4g2!0q4y4g2)9^5z5q4)9^5y4W2!0q4y4g2!0n7b7#2)9^5x3q4!0q4y4#2!0n7b7W2)9&6c8W2!0q4z5q4!0m8c8g2!0m8x3g2!0q4y4W2)9&6c8W2)9&6x3q4!0q4y4q4!0n7z5q4)9^5x3q4!0q4y4q4!0n7z5q4!0m8b7g2!0q4y4g2!0n7b7g2)9&6y4q4!0q4y4#2)9&6y4q4!0m8z5q4!0q4y4#2)9&6b7g2)9^5y4q4!0q4z5q4)9&6b7#2)9^5x3W2!0q4y4#2!0m8b7g2)9&6c8q4!0q4y4g2)9&6x3W2)9^5b7#2N6A6i4K6u0V1c8X3W2Q4c8e0g2Q4z5e0m8Q4z5e0N6Q4c8f1k6Q4b7V1y4Q4z5f1j5`.

解决方案:

【解决方案】

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

部分代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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 = `${base64}`;

  console.info('可用于展示的图片 src:', imgSrc);

});

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回