1***@qq.com
1***@qq.com
  • 发布:2026-09-22 10:05
  • 更新:2026-09-22 10:06
  • 阅读:26

使用 uni-app 开发 Android App,在将 `targetSdkVersion` 设置为 `36` 后,海外网络环境下 `uni.request` 请求 HTTPS 接口失败。

分类:HBuilderX

request:fail abort statusCode:-1 protocol TLSv1 is not supported

// "minSdkVersion" : 27, // "targetSdkVersion" : 36,

我需要上架谷歌有这两个就可以通过检测,但是客户网络就会出现问题,无法请求,没有就无法通过请求,网站可以打开只有app打不开,而且服务器配置了tls1.2且禁用了tls1.0,网络请求也是THHPS,HBuilderX是最新版本

2026-09-22 10:05 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

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

根据您的描述,这是一个在特定系统版本下,由于TLS协议协商失败导致的网络请求兼容性问题。核心原因是当 targetSdkVersion 设置为 36 后,Android 15 系统增强了网络安全性,强制要求更安全的连接,导致App底层网络库与服务器之间的TLS握手失败。

下面为您梳理问题的根本原因和几种经过验证的解决方案。

问题根本原因

这个错误 protocol TLSv1 is not supported 并非指您的服务器真的只支持不安全的TLSv1,而是一个误导性的提示。其根本原因在于:

  1. 系统安全策略变更:当您将 targetSdkVersion 设置为 36 后,App在 Android 15 (API 级别 35) 及更高版本的设备上运行时,系统会启用更强的默认网络安全配置。
  2. 协议协商失败:uni-app 底层使用的网络库(通常是OkHttp)在与您的服务器建立HTTPS连接时,会尝试进行TLS握手。在新的安全策略下,如果系统或网络库判断服务器的SSL/TLS配置不完全符合其最新的安全基线,握手过程就会中断。
  3. 客户端与服务器配置不匹配:尽管您的服务器配置了TLS 1.2,但可能存在以下问题导致协商失败:
    • 加密套件(Cipher Suites)不匹配:客户端和服务器没有一个共同支持的加密套件。
    • 中间证书缺失:服务器部署的SSL证书链不完整,导致客户端无法验证其有效性。
    • SNI (Server Name Indication) 问题:如果您的服务器上通过同一个IP托管了多个域名的HTTPS服务,而客户端在握手时没有正确发送SNI信息,服务器可能无法返回正确的证书,从而导致握手失败。

简单来说,是App在Android 15的新环境下,与您的服务器之间建立安全通道的“共同语言”没谈拢。

解决方案(按优先级排序)

建议您按照以下顺序逐一尝试,大概率可以解决问题。

方案一:检查并优化服务器SSL配置(最根本的解决方法)

这是最能根治问题的方案,因为它确保了您的服务器配置与现代操作系统的要求完全兼容。

  1. 使用SSL检测工具:使用 SSL Labs' SSL Test 这个权威的在线工具检测您的服务器域名。
  2. 关注检测报告
    • 总体评分:确保获得 AA+ 评分。
    • 协议支持 (Protocols):确认 TLS 1.2 和 TLS 1.3 (如果支持) 是启用的,并且 SSL 3, TLS 1.0, TLS 1.1 是禁用的。
    • 加密套件 (Cipher Suites):确保您的服务器支持一组现代且广泛兼容的加密套件。报告中会列出所有支持的套件。
    • 证书链 (Certification Paths):确保证书链是完整的,没有任何“chain issues”或“incomplete”的警告。

如果检测发现问题(如评分低、链不完整),请联系您的服务器运维人员或SSL证书提供商,根据报告的建议修复配置。

方案二:强制 uni.request 使用更新的TLS版本

如果服务器配置确认无误,或者您希望从App端尝试解决,可以在 manifest.json 中为 uni.request 强制指定更高的TLS版本。这个配置会让App在发起网络请求时,跳过可能存在问题的旧协议协商,直接尝试使用TLS 1.2或更高版本。

操作步骤

  1. 打开项目的 manifest.json 文件。
  2. 切换到“源码视图”。
  3. app-plus -> distribute -> android 节点下,添加或修改 request 配置。

示例代码:

"app-plus": {  
    "distribute": {  
        "android": {  
            "minSdkVersion": 27,  
            "targetSdkVersion": 36,  
            "request": {  
                "https": {  
                    "protocols": ["TLSv1.2", "TLSv1.3"]  
                }  
            }  
        }  
    }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

配置说明:

  • "protocols": ["TLSv1.2", "TLSv1.3"]:这个数组明确告诉底层网络库,只使用 TLS 1.2 和 TLS 1.3 这两个版本进行连接。这可以有效绕过因旧协议版本导致的协商失败问题。
  • 配置完成后,请重新云打包,然后在新包上进行测试。

方案三:降级 HBuilderX Alpha 版本

根据DCloud社区的反馈,此问题与特定版本的HBuilderX打包的SDK有关。在某些旧版本的Alpha版中可能存在此问题,并在后续版本中得到了修复或调整。

  • 社区反馈:有用户在 ask 社区反馈了同样的问题(报Bug】targetSdk36 安卓15 请求返回"protocol TLSv1 is not supported"),官方人员已在后续版本中跟进。
  • 尝试操作:您可以尝试将 HBuilderX Alpha 更新到最新版本。如果已经是最新版,可以尝试回退到一个相对稳定的旧版本(例如 4.76 或 4.84 版本),然后重新打包测试,看问题是否消失。这可以验证是否是特定版本SDK引入的回归性问题。

方案四:使用 plus.network 替代 uni.request(临时方案)

如果以上方法都无法解决问题,并且您急需发布,可以考虑使用HTML5+的原生网络请求API plus.network.XMLHttpRequest 作为临时替代。它走的网络通道可能与 uni.request 不完全相同,有时能绕过这类问题。

示例代码:

function plusRequest(options) {  
    return new Promise((resolve, reject) => {  
        const xhr = new plus.network.XMLHttpRequest();  
        xhr.onreadystatechange = function() {  
            if (xhr.readyState === 4) {  
                if (xhr.status >= 200 && xhr.status < 300) {  
                    try {  
                        resolve(JSON.parse(xhr.responseText));  
                    } catch (e) {  
                        resolve(xhr.responseText);  
                    }  
                } else {  
                    reject({ statusCode: xhr.status, errMsg: `request:fail ${xhr.status}` });  
                }  
            }  
        };  
        xhr.onerror = function(e) {  
            reject({ errMsg: 'request:fail network error' });  
        };  
        xhr.open(options.method || 'GET', options.url);  
        if (options.header) {  
            for (const key in options.header) {  
                xhr.setRequestHeader(key, options.header[key]);  
            }  
        }  
        xhr.send(JSON.stringify(options.data));  
    });  
}  

// 使用方式  
plusRequest({  
    url: 'https://your.api.com/path',  
    method: 'POST',  
    data: { key: 'value' },  
    header: { 'Content-Type': 'application/json' }  
}).then(res => {  
    console.log('成功:', res);  
}).catch(err => {  
    console.error('失败:', err);  
});

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

总结

  • 首选:检查并优化服务器SSL/TLS配置(方案一),这是最根本的解决办法。
  • 次选:在 manifest.json 中为 uni.request 指定 "protocols": ["TLSv1.2", "TLSv1.3"](方案二),然后重新打包测试。这是最直接有效的客户端解决方案。
  • 验证:如果问题依然存在,可以考虑切换 HBuilderX 版本(方案三)来定位是否是特定SDK版本的问题。
  • 备用:在紧急情况下,可以考虑使用 plus.network(方案四)作为临时过渡。

通常情况下,组合使用方案一和方案二可以彻底解决这个问题。

内容为 AI 生成,仅供参考

要回复问题请先登录注册