已关闭
[Bug] br_rnoh0.72 PDF 加载、页面交互及模块初始化异常 #73
SailFlorve创建于  23 天前关闭于  10 天前
SailFlorve
23 天前 创建

问题描述

HarmonyOS 实现中的 PDF 远程加载、页面单击事件和 NativeModule 兼容性存在以下问题:

  1. 下载任务失败时 Promise 未结束,组件永久停留在 loading 状态。
  2. onPageSingleTap 没有触发。
  3. HTTP://、HTTPS:// 等大写协议头的 PDF URL 无法加载。
  4. HarmonyOS 未注册 PdfManager NativeModule 时,调用 PdfManager.loadFile 会同步抛出 TypeError。
  5. HarmonyOS 未注册 react-native-blob-util NativeModule 时,模块初始化读取 getConstants 会导致应用启动失败。
  6. HTTP 4xx/5xx 响应被当作下载完成处理,错误响应体会被继续交给 PDF 解析器。
  7. HarmonyOS 无法加载 data:application/pdf;base64,... 格式的 PDF。

复现步骤

  1. 使用 PdfView 加载不可访问或下载失败的 HTTP(S) PDF 地址,观察加载状态和 onError 回调。
  2. 加载任意可正常显示的 PDF,使用单指点击页面,观察 onPageSingleTap 回调。
  3. 将 source.uri 设置为 HTTPS://... 或 HTTP://...,加载 PDF,观察网络识别和下载结果。
  4. 在未注册 HarmonyOS PdfManager NativeModule 的工程中调用 PdfManager.loadFile(...),观察 JS 引擎和应用启动结果。
  5. 在未提供 react-native-blob-util NativeModule 的 HarmonyOS 工程中引入 PDF 组件并启动应用,观察 JS bundle 初始化过程。
  6. 请求返回 HTTP 404/500 的 PDF 地址,观察 onError 是否携带明确下载失败信息。
  7. 将 source.uri 设置为合法的 base64 PDF 数据,观察 PDF 是否能加载。

预期结果

  • 下载失败时及时结束加载流程并触发错误处理,不应永久处于 loading 状态。
  • 单指点击 PDF 页面时触发 onPageSingleTap,并传递页码和点击坐标。
  • HTTP/HTTPS scheme 大小写均可识别,下载请求符合 HarmonyOS SDK 参数要求。
  • 未注册或不支持的 NativeModule 调用以可处理的 Promise rejection 返回,不应同步抛错或导致应用红屏。
  • HarmonyOS 下不应初始化缺失的 react-native-blob-util NativeModule。
  • HTTP 4xx/5xx 响应通过 onError 返回下载失败,不应继续按 PDF 文件解析。
  • base64 PDF 能被解码并加载。

实际结果

  • 下载失败后组件永久处于加载状态。
  • onPageSingleTap 永远不触发。
  • 大写协议头 URL 被错误识别或被 HarmonyOS 下载 API 拒绝,典型日志为 Parameter verification failed, the url should start with http(s)://。
  • PdfManager.loadFile 在 NativeModule 缺失时同步抛出 TypeError,可能导致 Invariant Violation: "app_name" has not been registered。
  • react-native-blob-util NativeModule 缺失时,初始化阶段访问 getConstants 导致应用启动失败。
  • HTTP 404/500 响应被保存后进入 PDF 解析流程,最终表现为解析失败或错误信息不明确。
  • base64 PDF 被拒绝加载。

复现概率

必现(100%,网络场景需设备可访问测试地址)。

环境信息

  • React Native OHOS / RNOH:br_rnoh0.72
  • 库版本:@react-native-ohos/react-native-pdf@6.7.6-beta.2
  • 平台:HarmonyOS/OpenHarmony 真机
  • 验证工程:24P32

DEMO

import Pdf from '@react-native-ohos/react-native-pdf';

<Pdf
  source={{ uri: 'HTTPS://example.invalid/sample.pdf' }}
  onPageSingleTap={(page, x, y) => {
    console.info('page single tap', page, x, y);
  }}
/>
<Pdf source={{ uri: 'data:application/pdf;base64,JVBERi0xLjQ...' }} />
import PdfManager from './PdfManager';

await PdfManager.loadFile('/data/storage/el2/base/files/sample.pdf');

RNT 测试用例:

  • 24P4/rn-tester/examples/react-native-pdf/testCase/Test/PdfApitest.tsx
  • 24P4/rn-tester/examples/react-native-pdf/testCase/Test/PdfErrorApitest.tsx
  • 24P32/rn-tester/examples/react-native-pdf/PdfTest.tsx

影响范围

影响 HarmonyOS 上远程 PDF、base64 PDF、页面单击事件、PdfManager 和 react-native-blob-util 相关场景,可能导致 PDF 无法加载、加载界面永久卡住、页面点击功能不可用或 NativeModule 缺失时应用直接启动失败。

likedislike
SSailFlorve
23 天前 关联了pull request:fix(harmony): 修复 PDF 加载、页面交互及模块初始化异常
openharmony_ciopenharmony_ci成员
10 天前 关闭了 issue