小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
引言
本文是梳理粉丝对博文:【对请求参数进行签名】请求参数按照ASCII码从小到大排序、拼接、加密(采用递归的方式进行实现)的相关问题及对应解决方案。
demo地址:https://download.csdn.net/download/u011018979/15483107
I、签名数组ASCII码排序优化
1.1 优化数组元素的排序
记录一个用户反馈的bug,修改内容如下图:
数组的地方,我的规则是[] 表示数组,数组元素是用,分隔[,,,] 进行递归拼接的。
如果你认为数组ASCII码排序的地方是错误的话,你可以打印排序之后的字符串,看排序与你服务侧的拼接规则哪里不一样。把规则修改为与后台的数组排序规则一致即可。
/**
- 处理key对应的Value是数组的情况
*/
+ (NSString *)sortedDictionaryArr:(NSArray *)arr {
NSMutableString *contentString =[NSMutableString string];
#pragma mark - ******** 可选
arr = [self sortedArrBykey:sortedArray];//
for ( id obj in arr ) {
NSString * tmp = @"";
if(contentString.length<1 || [contentString isEqualToString:@""]){//
}
else{
[contentString appendString:@","];
}
if( [obj isKindOfClass:NSDictionary.class]){
tmp = [self sortedDictionary:obj];
}
// 数组就[]
else if( [obj isKindOfClass:NSArray.class]){
tmp = [self sortedDictionaryArr:obj];
tmp = [NSString stringWithFormat:@"%@%@%@",@"{",tmp,@"}"];
}
else{
tmp= obj;
}
[contentString appendFormat:@"%@",tmp];
}
contentString = [NSString stringWithFormat:@"%@%@%@",@"[",contentString,@"]"];
return contentString;
}
例子:编辑门店的商品的价格 请求报文:
{
"adjustStocks" : [
{
"nnewStockNum" : "0",
"productId" : "1280072986512433152",
"newStockNum" : "0",
"oldStockNum" : "0",
"storeId" : "25063",
"productSkuId" : "1280072986516627456",
"batchNo" : ""
}
],
"modifyPrices" : [
{
"tagId" : "25063",
"productNewPrice" : "5",
"productSkuId" : "1280072986516627456",
"type" : "1",
"productId" : "1280072986512433152",
"productOldPrice" : "33"
}
]
}
签名元字符串的ASCII码排序
adjustStocks=[batchNo=&newStockNum=0&nnewStockNum=0&oldStockNum=0&productId=1280072986512433152&productSkuId=1280072986516627456&storeId=25063]&modifyPrices=[productId=1280072986512433152&productNewPrice=55&productOldPrice=5&productSkuId=1280072986516627456&tagId=25063&type=1]&appsecret=4f7b71
1.2 新增集合元素排序:
对于数组排序,我的初步想法是,先按照数组元素的class类型进行分组,其中的子数组是字符串类型的话,就对其进行排序之后再重新组合到新的数组中。然后再进行遍历递归拼接
/**
1、新增集合元素排序:对于数组排序,我的初步想法是,先按照数组元素的class类型进行分组,其中的子数组是字符串类型的话,就对其进行排序之后再重新组合到新的数组中。然后再进行遍历递归拼接
*/
+ (NSMutableArray *)sortedArrBykey:(NSArray *)array {
// 对数组先按照class类型进行排序
//1)取出分组
// NSArray *arDistinct = [array valueForKeyPath:@"@distinctUnionOfObjects.class"];// 无法获取到字典class类型
// NSMutableArray *classArr = [NSMutableArray arrayWithArray:arDistinct];
NSMutableArray *strclassArr = [NSMutableArray array];
NSMutableArray *nostrclassArr = [NSMutableArray array];
for (NSObject* obj in array) {
if([obj isKindOfClass:NSString.class]){
[strclassArr addObject:obj];
}else{
[nostrclassArr addObject:obj];
}
}
// 4)按照日期进行分组
NSMutableArray* sortedArray = [NSMutableArray array];
strclassArr = [strclassArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj1 compare:obj2 options:NSNumericSearch];
}];
[sortedArray addObjectsFromArray:strclassArr];
[sortedArray addObjectsFromArray:nostrclassArr];
return sortedArray;
}
1.3 微信支付参数值为空不参与排序的处理方案
参数为空的 只要排序之前从字典移除即可。
规则的原因 :签名只对针对重要的字段,值可空的参数可不必参加
II、其他编译相关问题
2.1 为什么我下载demo后,在xcode12中允许报错:library not found for -lAXIndicatorView;请问怎么解决?
原因:这是找不到 CocoaPods库 AXIndicatorView。是 AXWebViewController库依赖于它
- 解决方法: 你更新 pod 'AXWebViewController' 即可。
1、只更新指定的库,其它库忽略:
pod update AXWebViewController --verbose --repo-update
2、pod update会更新所有的类库,获取最新版本的类库
cocoapods 用法文章:https://blog.csdn.net/z929118967/article/details/103830017
exit 0% ➜ retail git:(develop) ✗ cat ~/bin/knpod
#!/bin/sh
#该命令只安装新添加的库,已更新的库忽略
pod install --verbose --no-repo-update
#该命令只更新指定的库,其它库忽略
#pod update 库名 --verbose --no-repo-update
exit 0% ➜ retail git:(develop) ✗
see also
更多资讯和服务请关注#小程序:iOS逆向
,只为你呈现有价值的信息,专注于移动端技术研究领域。
更多资源下载请访问博客:kunnan.blog.csdn.net/article/det…