前言
- 由于之前app版本采用的是socket文件上传,上传文件速度和稳定都没有保障,所以老大决定使用腾讯云,进行上传测试,由于测试下来效果还不错,60M大概十分钟的样子,满足了我们的业务需求,故采用腾讯云的SDK进行文件上传的操作。
技术误区
- 在嵌入腾讯云的SDK的时候,出现的问题就是签名无法通过
解决方法
-
在腾讯云的官方文档中有关于签名算法的描述
-
对比JAVA代码进行秘钥生成方法的封装
代码如下
//生成签名的方法
-(NSString*)caculateSign{
NSArray *timeArray =[self getCurrentTimestamp];
NSInteger random = arc4random()%100000000;
// 其中APPID,BUCKETNAME,QCLOUDSECRET,分别对应的产品的appid,bucketName,secretid,在腾讯云的控制平台上都可以找到
NSString *original =[NSString stringWithFormat:@"a=%@&b=%@&k=%@&e=%@&t=%@&r=%ld&f=",APPID,BUCKETNAME,QCLOUDSECRET,timeArray.lastObject,timeArray.firstObject,random];
//这个地方是HmacSHA1加密算法的封装
NSData *temp =[HmacSHA1 HmacSha1:QCLOUDKEY data:original];
//官方文档中描述的
注 2:由于使用了 HMAC 算法,计算 SignTmp 的结果为二进制字符串,因此建议将算法写在同一函数中实现。单独输出 SignTmp 可能导致拼接后的字串有误。
//一定要将生成的字符加密之后转成NSData的对象,然后把original转成NSData进行拼接,[不是两个字符串的拼接,一定要注意]
NSMutableData *resultData=[[NSMutableData alloc] initWithData:temp];
[resultData appendData:[original dataUsingEncoding:NSUTF8StringEncoding]];
//最后用base64编码
return [resultData base64EncodedStringWithOptions:0];
}
//获取当前时间和失效时间
-(NSArray*)getCurrentTimestamp{
NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];
NSTimeInterval a=[date timeIntervalSince1970];
//我的签名有效期为90天,7776000为秒,所有签名中的时间都是以秒为单位
NSTimeInterval e = a+7776000;
NSString *timeString = [NSString stringWithFormat:@"%0.f", a];//转为字符型
NSString *expireTime =[NSString stringWithFormat:@"%0.f",e];
return @[timeString,expireTime];
}
吐槽
-
腾讯的demo写的真的不咋地,我感觉作为一款让别人用的产品还是应该用心
-
最后如果遇到问题,多看一下他们的错误码表,对应自己的错误状态,迅速修正,我以为当时嵌入一个SDK也就一个小时的时间,结果搞了一天。
网友评论