tencent cloud

对象存储

动态与公告
产品动态
产品公告
产品简介
产品概述
功能概览
应用场景
产品优势
基本概念
地域和访问域名
规格与限制
产品计费
计费概述
计费方式
计费项
免费额度
计费示例
查看和下载账单
欠费说明
常见问题
快速入门
控制台快速入门
COSBrowser 快速入门
用户指南
创建请求
存储桶
对象
数据管理
批量处理
全球加速
监控与告警
运维中心
数据处理
内容审核
智能工具箱
数据工作流
应用集成
工具指南
工具概览
环境安装与配置
COSBrowser 工具
COSCLI 工具
COSCMD 工具
COS Migration 工具
FTP Server 工具
Hadoop 工具
COSDistCp 工具
HDFS TO COS 工具
GooseFS-Lite 工具
在线辅助工具
自助诊断工具
实践教程
概览
访问控制与权限管理
性能优化
使用 AWS S3 SDK 访问 COS
数据容灾备份
域名管理实践
图片处理实践
COS 音视频播放器实践
工作流实践
数据直传
内容审核实践
数据安全
数据校验
大数据实践
COS 成本优化解决方案
在第三方应用中使用 COS
迁移指南
本地数据迁移至 COS
第三方云存储数据迁移至 COS
以 URL 作为源地址的数据迁移至 COS
COS 之间数据迁移
Hadoop 文件系统与 COS 之间的数据迁移
数据湖存储
云原生数据湖
元数据加速
数据加速器 GooseFS
数据处理
数据处理概述
图片处理
媒体处理
内容审核
文件处理
文档处理
故障处理
获取 RequestId 操作指引
通过外网上传文件至 COS 缓慢
访问 COS 时返回403错误码
资源访问异常
POST Object 常见异常
API 文档
简介
公共请求头部
公共响应头部
错误码
请求签名
操作列表
Service 接口
Bucket 接口
Object 接口
批量处理接口
数据处理接口
任务与工作流
内容审核接口
云查毒接口
SDK 文档
SDK 概览
准备工作
Android SDK
C SDK
C++ SDK
.NET(C#) SDK
Flutter SDK
Go SDK
iOS SDK
Java SDK
JavaScript SDK
Node.js SDK
PHP SDK
Python SDK
React Native SDK
小程序 SDK
错误码
鸿蒙(Harmony) SDK
终端 SDK 质量优化
安全与合规
数据容灾
数据安全
访问管理
常见问题
热门问题
一般性问题
计费计量问题
域名合规问题
存储桶配置问题
域名和 CDN 问题
文件操作问题
日志监控问题
权限管理问题
数据处理问题
数据安全问题
预签名 URL 问题
SDK 类问题
工具类问题
API 类问题
服务协议
Service Level Agreement
隐私政策
数据处理和安全协议
联系我们
词汇表

弱网优化

PDF
聚焦模式
字号
最后更新时间: 2026-02-10 15:59:05

简介

本文介绍如何通过 COS SDK 使用 QUIC 协议访问 COS。

功能说明

针对弱网环境,COS SDK 已支持 QUIC 协议。QUIC 协议是一种基于 UDP 实现的低延迟高可靠通信协议,目前标准的 HTTP3 协议正是基于 QUIC 实现的。QUIC 支持 0-RTT 建立连接和无队头阻塞的多路复用,可以比较容易的在端侧实现用户态拥塞控制,更大限度地利用网络带宽进行实际的数据传输,在丢包率和网络延迟较高的弱网环境也可提供高质量的数据通信。同时,QUIC 还支持连接迁移,在移动端频繁切换网络的场景中,也可平滑过渡,保证网络不中断。
因此,如果您对上传下载等 COS 操作在弱网环境中的成功率、延迟较为敏感,您可以使用 QUIC 协议访问 COS。

前提条件

在开始执行操作前,您需要开通 EdgeOne 服务以及 QUIC 功能,并添加对应的 COS 域名。详细操作步骤如下:
1. 前往 EdgeOne 控制台 开通,具体操作请参见 开通 EdgeOne
2. 在 EdgeOne 控制台单击添加站点,添加业务方的加速域名。进入站点后进行域名管理 添加域名时请选择对象存储源站



3. 开启 EdgeOne 的 QUIC 功能,请参见 开启HTTP/3(QUIC)
4. 记录步骤2中的加速域名,该域名后续需要配置到 COS SDK 中。
注意:
EdgeOne 会产生一定的费用,详情请参见 EdgeOne 计费说明

操作步骤

步骤1:配置 QUIC 协议

Android
iOS
1. 在应用级别(通常是 App 模块下)的 build.gradle 中添加 QUIC 库依赖。
说明:
QUIC SDK 1.5.46已适配 16 KB page sizes,建议升级。
升级 QUIC SDK 时请同步升级 COS SDK 版本为 5.9.46及以上,否则可能存在兼容性问题。
dependencies {
...
// 增加此行
implementation 'com.qcloud.cos:quic:1.5.46'
}
2. 通过 COS SDK 中 CosXmlServiceConfig 进行自定义域名开启 QUIC
String region = "ap-beijing"; // 您的存储桶地域
String eoDomain = "exampledomain.com"; // eo 加速域名

CosXmlServiceConfig cosXmlServiceConfig = new CosXmlServiceConfig.Builder()
.setRegion(region)
.setHost(eoDomain) // 配置加速域名
.addNoSignHeaders("Host") // EO 转发请求时 host 会变化,此处需要避免 host 签名
.enableQuic(true) // 开启 QUIC
.builder();

CosXmlService cosXmlService = new CosXmlService(context, cosXmlServiceConfig,
credentialProvider);
1. 在 podfile 文件中添加 QUIC 库依赖。
pod 'QCloudQuic'
2. 通过 COS SDK 中 QCloudServiceConfiguration 进行自定义域名开启 QUIC
NSString * eoDomain = @"exampledomain.com";
QCloudServiceConfiguration* configuration = [QCloudServiceConfiguration new];
configuration.enableQuic = YES; // 开启 Quic
configuration.appID = @"appId"; // 设置 APPId
configuration.signatureProvider = self;
QCloudCOSXMLEndPoint* endpoint = [[QCloudCOSXMLEndPoint alloc] initWithLiteralURL:[NSURL URLWithString:eoDomain]]; // 配置加速域名
endpoint.useHTTPS = YES; // 使用 HTTPS
configuration.endpoint = endpoint;

步骤2:SDK 内配置协议切换

为了提高 SDK 请求的成功率以及节省成本,SDK 提供了协议切换策略的配置方法:
保守策略:先使用默认的 HTTPS 协议进行请求,网络失败后自动使用 QUIC 协议进行重试。
激进策略:先使用 QUIC 协议进行请求,网络失败后自动使用默认的 HTTPS 协议进行重试。
自定义策略:SDK 提供了配置请求网络协议的方法,可以灵活的在业务层控制请求和切换的逻辑(例如根据网络质量自动切换)。
不配置切换策略,则直接使用步骤一中的 QUIC 协议进行请求。
Android
iOS
通过 COS SDK 中 CosXmlServiceConfig 的 setNetworkSwitchStrategy 方法进行保守和激进策略的配置。
String region = "ap-beijing"; // 您的存储桶地域
String eoDomain = "exampledomain.com"; // eo 加速域名
// 激进策略
CosXmlServiceConfig.RequestNetworkStrategy aggressiveStrategy = CosXmlServiceConfig.RequestNetworkStrategy.Aggressive;
// 保守策略
CosXmlServiceConfig.RequestNetworkStrategy conservativeStrategy = CosXmlServiceConfig.RequestNetworkStrategy.Conservative;

CosXmlServiceConfig cosXmlServiceConfig = new CosXmlServiceConfig.Builder()
.setRegion(region)
.setHost(eoDomain) // 配置加速域名
.addNoSignHeaders("Host") // EO 转发请求时 host 会变化,此处需要避免 host 签名
.enableQuic(true) // 开启 QUIC
.setNetworkSwitchStrategy(aggressiveStrategy) // 配置切换策略为激进策略
//.setNetworkSwitchStrategy(conservativeStrategy) // 配置切换策略为保守策略
.builder();

CosXmlService cosXmlService = new CosXmlService(context, cosXmlServiceConfig,
credentialProvider);
通过请求基类 CosXmlRequest 的 setNetworkType 进行自定义策略的配置。
// 任何 CosXmlRequest 都支持这种方式,例如上传 PutObjectRequest、下载 GetObjectRequest、删除 DeleteObjectRequest 等
// 以下用上传进行示例
PutObjectRequest putRequest = new PutObjectRequest("examplebucket-1250000000", "exampleobject.txt", "本地文件路径");
// 自定义配置 QUIC 协议
putRequest.setNetworkType(CosXmlRequest.RequestNetworkType.QUIC);
// 自定义配置默认的 HTTPS 协议
// putRequest.setNetworkType(CosXmlRequest.RequestNetworkType.OKHTTP);
// 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档
TransferConfig transferConfig = new TransferConfig.Builder().build();
// 初始化 TransferManager
TransferManager transferManager = new TransferManager(cosXmlService, transferConfig);
COSXMLUploadTask uploadTask = transferManager.upload(putRequest, null);
通过 COS SDK 中 QCloudServiceConfiguration 的 networkStrategy 方法进行保守和激进策略的配置。
NSString * eoDomain = @"exampledomain.com";
QCloudServiceConfiguration* configuration = [QCloudServiceConfiguration new];
configuration.appID = @"appId"; // 设置 APPID
configuration.signatureProvider = self;
QCloudCOSXMLEndPoint* endpoint = [[QCloudCOSXMLEndPoint alloc] initWithLiteralURL:[NSURL URLWithString:eoDomain]]; // 设置加速域名
endpoint.useHTTPS = YES; // 使用 https
// 配置加速域名
configuration.endpoint = endpoint;
// 配置切换策略为激进策略
configuration.networkStrategy = QCloudRequestNetworkStrategyAggressive;
// 配置切换策略为保守策略
// configuration.networkStrategy = QCloudRequestNetworkStrategyConservative;
// 开启 QUIC
configuration.enableQuic = YES;
[QCloudCOSXMLService registerDefaultCOSXMLWithConfiguration:configuration];
[QCloudCOSTransferMangerService registerDefaultCOSTransferMangerWithConfiguration:configuration];
注意:
EO 转发请求时 host 会变化,生成签名时需要指定Host不参与签名。如下所示:
- (void) signatureWithFields:(QCloudSignatureFields*)fileds
request:(QCloudBizHTTPRequest*)request
urlRequest:(NSMutableURLRequest*)urlRequst
compelete:(QCloudHTTPAuthentationContinueBlock)continueBlock
{
//这里同步从后台服务器获取临时密钥,强烈建议将获取临时密钥的逻辑放在这里,最大程度上保证密钥的可用性
//...
QCloudCredential* credential = [QCloudCredential new];

// 临时密钥 SecretId
// sercret_id 替换为用户的 SecretId,登录访问管理控制台查看密钥,https://console.tencentcloud.com/cam/capi
credential.secretID = @"SECRETID";
// 临时密钥 SecretKey
// sercret_key替换为用户的 SecretKey,登录访问管理控制台查看密钥,https://console.tencentcloud.com/cam/capi
credential.secretKey = @"SECRETKEY";
// 临时密钥 Token
// 如果使用永久密钥不需要填入 token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见 https://www.tencentcloud.com/document/product/436/14048?from_cn_redirect=1
credential.token = @"TOKEN";
/** 强烈建议返回服务器时间作为签名的开始时间, 用来避免由于用户手机本地时间偏差过大导致的签名不正确(参数 startTime 和 expiredTime 单位为秒)
*/
credential.startDate = [NSDate dateWithTimeIntervalSince1970:startTime]; // 单位是秒
credential.expirationDate = [NSDate dateWithTimeIntervalSince1970:expiredTime]];// 单位是秒

QCloudAuthentationV5Creator* creator = [[QCloudAuthentationV5Creator alloc]
initWithCredential:credential];
// 设置需要参与签名的 Header,不包含 Host 即可。
creator.shouldSignedList = @[@"Cache-Control", @"Content-Disposition", @"Content-Encoding", @"Content-Length", @"Content-MD5", @"Content-Type", @"Expect", @"Expires", @"If-Match" , @"If-Modified-Since" , @"If-None-Match" , @"If-Unmodified-Since" , @"Origin" , @"Range" , @"transfer-encoding",@"Pic-Operations",@"ci-process"];
// 注意 这里不要对 urlRequst 进行 copy 以及 mutableCopy 操作
QCloudSignature *signature = [creator signatureForData:urlRequst];
continueBlock(signature, nil);
}
通过设置基类 QCloudAbstractRequest 的 endpoint 进行自定义域名的配置。
QCloudPutObjectRequest* put = [QCloudPutObjectRequest new];
// 存储桶名称,由BucketName-Appid 组成,可以在 COS 控制台查看 https://console.tencentcloud.com/cos5/bucket
put.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
put.object = @"exampleobject";
// 文件内容,可以传入NSData*或者NSURL*类型的变量
put.body = [@"testFileContent" dataUsingEncoding:NSUTF8StringEncoding];
// 自定义配置 QUIC 协议
put.networkType = QCloudRequestNetworkQuic;
[put setFinishBlock:^(id result, NSError *error) {
// result 包含响应的 header 信息
// 获取文件 crc64
NSString * crc64 = [[result __originHTTPURLResponse__].allHeaderFields valueForKey:@"x-cos-hash-crc64ecma"];
}];
[[QCloudCOSXMLService defaultCOSXML] PutObject:put];

示例工程

Android 示例 Demo 请参见 COS SDK 网络优化 Demo 下的 CosServiceFactory
iOS 示例 Demo 请参见 COS SDK 网络优化 Demo 下的 AppDelegate

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈