我们在对接一些第三方的SDK的接口的时候,通常需要签名,签名方法就是:
- 将字典类型的参数,按照key的升序排列后,拼接成待签名的原始字符串
- 将原始字符串进行MD5加密
今天我们主要是分析将字典升序排列后拼接成待签名的原始字符串的
举个栗子
假设说我们待排序的字典是这样的:
NSDictionary *params = @{
@"name":@"LinH",
@"hometown":@"Dongying",
@"userID":@"330909199301271234",
@"phone":@"18814868888"
};
那我们使用的方法如下:
/**
字典的升序排列以及字符串的拼接
@param params 待排序的字典
@return 拼接好的字符串
*/
- (NSString *)getStringWithDic:(NSMutableDictionary*)params{
//排序key
NSArray *keyArray = [params allKeys];//获取待排序的key
NSArray *sortArray = [keyArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2 ];
}];//获取排序后的key
//排序后的以key=value拼接的数组
NSMutableArray *valueArray = [NSMutableArray array];
for(NSString *sortSring in sortArray){
NSString *signSring = [NSString stringWithFormat:@"%@=%@",sortSring,[params objectForKey:sortSring]];
[valueArray addObject:signSring];
}
// 就是用“,”把每个排序后拼接的数组,用字符串拼接起来
NSString *string = [valueArray componentsJoinedByString:@"&"];
return string;
}
最后得到的字符串
hometown=Dongying&name=LinH&phone=18814868888&userID=330909199301271234
ps:在实际生产环境中,字典要判断value是否为空的情况。当value为空时,
compare:...
总是返回NSOrderedSame。因为返回的是nil,而nil在OC中是0,而NSOrderedSame在枚举中的值就是等于0.