前言:最近做项目上传文件到腾讯云,在自己手上的真机上测试没有出现任何问题,提交测试后,也没出现任何问题,都可以上传到腾讯云。
可是从app store下载后,部分客户投诉上传不成功,提示以下错误信息:
-180 ERROR_CMD_COS_INVALID_PATH 非法路径
当时就蒙了,那么多测试机怎么都没问题,这么错误怎么找?只能去查查腾讯云提供的错误解决方案,然而只说了这么一条:
好吧,还是自己去查代码:
//sign, bucket都是腾讯云提供的
//zipPath 为 (~/document/XXX.db.zip)
//remotePath是通过时间戳来生成的
TXYFileUploadTask *fileTask = [[TXYFileUploadTask alloc] initWithPath:zipPath
sign:sign
bucket:bucket
customAttribute:nil
uploadDirectory:remotePath
msgContext:nil];
获取remotePath的时间戳的代码如下:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYYMMddhhmmssSSS"];
NSString *date = [formatter stringFromDate:[NSDate date]];
仔细看看,唯一可能产生变化的是沙盒那个路径,先把问题定位在沙盒路径,与腾讯云定义的规范有冲突?公司测试机都又测不出问题,于是就联系朋友,纷纷下载使用,最终还是找到一个可以出现“非法路径”的真机,说多了都是泪。
省去测试流程,发现问题所在,就是格式化日期的坑,上面的时间戳的代码,运行一下:
控制台居然显示:
格式化后字符串:2016060310:38:46.702
what happened!!! 居然没按时间格式的字符串格式化!!!出现了":",好了,这个就是问题所在,解决它的方案,设置formatter的区域:
结果就按自己定义的格式显示了,再放入项目中,发现上传成功,OK!原来是区域的问题,好吧,我来看看到底原来到底是什么鬼区域,代码如下:
Wow,居然是“zh_CN”,那为什么不按我们设置的格式格式化日期呢?非要强制设定区域之后才能正常格式化,百思不解!
设置区域在格式化时间中的重要性####
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
补充:对于这样的小问题,强烈推荐还是用JSPatch来修复。
JSPatch分发平台:http://jspatch.com/Apps/index
JSPatch转化平台:http://bang590.github.io/JSPatchConvertor/