y***@yinzon.com
y***@yinzon.com
  • 发布:53 分钟前
  • 更新:53 分钟前
  • 阅读:9

【报Bug】HBuilderX 5.26 uni-app x iOS 18.6 模拟器调用 uni.request 后无回调并阻塞 JS 线程

分类:uni-app x

环境

  • HBuilderX:5.26.2026091802 正式版
  • 开发机:macOS 27.0(26A428),Apple Silicon arm64
  • 项目:uni-app x,Vue 3,Vapor 模式
  • 运行环境:iOS 18.6 模拟器,iPhone17,4,x86_64 自定义基座
  • 打包方式:云端自定义基座

问题现象

在完整自定义基座中调用 uni.request 后,successfailcomplete 均不回调;请求前注册的看门狗 setTimeout 也不再执行,页面表现为按钮一直处于加载状态。

最小代码

以下 URL 请替换为任意已确认可访问、返回 JSON 的 HTTPS 地址:

console.log('[probe] before request')  

setTimeout(() => {  
  console.log('[probe] watchdog fired')  
}, 8000)  

uni.request({  
  url: 'https://<可访问的 JSON HTTPS 接口>',  
  method: 'GET',  
  timeout: 6000,  
  success: (res) => {  
    console.log('[probe] success', res.statusCode)  
  },  
  fail: (err) => {  
    console.log('[probe] fail', err.errMsg)  
  },  
  complete: () => {  
    console.log('[probe] complete')  
  }  
})

复现步骤

  1. 使用 HBuilderX 5.26.2026091802 正式版创建或打开 uni-app x Vapor 项目。
  2. 云端生成包含网络模块的 iOS x86_64 模拟器自定义基座。
  3. 在 iOS 18.6 模拟器中运行,并在按钮事件中执行上述代码。
  4. 观察请求回调及 8 秒看门狗日志。

实际结果

uni.request 不触发 successfailcomplete,看门狗 setTimeout 也不执行,页面永久停留在加载状态。

预期结果

请求成功时触发 successcomplete;失败或超时时触发 failcomplete。无论网络结果如何,JS 事件循环及定时器应继续运行。

已排除项目

  1. 同一个 URL 和请求参数改用 UTS 混编的 Swift URLSession 后,可立即获得 HTTP 200,并正常回调到 UTS 主线程。
  2. 后端接口可从 macOS 原生 URLSession 正常访问。
  3. UTS 编译、App 资源发行、自定义基座安装均成功,没有编译错误。
  4. Android 路径继续使用 uni.request,目前没有观察到相同行为。

初步判断与临时方案

疑似 iOS x86_64 自定义基座内 uni-network / uni.request 到原生层的桥接阻塞。当前使用 iOS 专用 Swift URLSession 作为绕过方案,希望官方确认是否为 5.26 iOS 模拟器基座问题。

53 分钟前 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app x技术交流群 ) 咨询,群中有相关专业的管理员和群友。

关于 HBuilderX 5.26 iOS 18.6 模拟器 uni.request 无回调问题的分析

初步判断

根据您提供的信息,这个问题已经具备较好的排查基础。您提到"阻塞 JS 线程",根据 ISSUE 系统 #19575 中官方人员的解释,uni.request 在请求完成后会自动将回调 post 到调用线程执行(模拟单线程环境),如果在主线程中使用了阻塞 API(如 CountDownLatch.await()),会导致死锁。

但您的情况是没有主动阻塞也会出现无回调,这更可能是模拟器环境本身的问题。

关键参考:x86_64 模拟器兼容性

根据 DCloud问答 #182893 中官方人员的回复:

使用模拟器的CPU类型为x86_64导致了上面的问题。因三方so库影响,uni-app不支持这个cpu类型。

虽然该案例针对 Android,但 iOS 模拟器同样存在 CPU 架构差异问题。您的配置是:

  • 开发机:Apple Silicon (arm64)
  • 模拟器:iPhone17,4,x86_64 自定义基座

在 Apple Silicon Mac 上运行 x86_64 模拟器时,是通过 Rosetta 2 翻译执行的,这可能导致原生桥接层出现问题。

建议排查方向

1. 使用 arm64 架构模拟器测试

在 Apple Silicon Mac 上,建议创建或使用 arm64 架构的 iOS 模拟器:

# 列出可用模拟器  
xcrun simctl list devicetypes  

# 创建 arm64 模拟器(如果可用)  
xcrun simctl create "iPhone17,4-arm64" "iPhone17,4" "iOS18.6"

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

2. 使用真机测试

根据官方文档和 ISSUE 系统的经验,真机是最可靠的调试环境。如果 arm64 模拟器仍有问题,建议使用真机验证。

3. 临时方案

您已使用的 Swift URLSession 混编方案 是正确的绕过方式。具体可参考 uni-app x 原生混编文档

// 在 uts 插件中使用 Swift 原生代码  
import Foundation  

class NetworkManager {  
    static func request(url: String, completion: @escaping (Result<Data, Error>) -> Void) {  
        guard let url = URL(string: url) else {  
            completion(.failure(NSError(domain: "Invalid URL", code: -1)))  
            return  
        }  

        URLSession.shared.dataTask(with: url) { data, response, error in  
            if let error = error {  
                completion(.failure(error))  
            } else if let data = data {  
                completion(.success(data))  
            }  
        }.resume()  
    }  
}

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

问题上报建议

建议将此问题提交至 DCloud Issues 系统,附上以下信息以便官方复现:

  1. 最小复现项目(可脱敏)
  2. 完整环境信息(您已提供,很详细)
  3. 对比测试:x86_64 模拟器 vs arm64 模拟器 vs 真机
  4. 日志输出:HBuilderX 控制台日志 + 原生日志(可在控制台右上角开启)

总结

可能原因 验证方法
x86_64 模拟器架构兼容性问题 换 arm64 模拟器或真机测试
iOS 18.6 特定版本问题 换其他 iOS 版本模拟器测试
自定义基座云端打包问题 使用本地标准基座测试
uni-network 模块在模拟器桥接层问题 使用 Swift URLSession 绕过(您已验证可行)

由于您已确认 Swift URLSession 混编可以正常工作,这强烈表明问题出在 uni.request 到原生层的桥接环节,而非网络本身或您的代码问题。建议优先尝试 arm64 模拟器,并考虑向官方提交 Issue。

内容为 AI 生成,仅供参考

要回复问题请先登录注册