参考以下SDK集成说明为您的iOS应用集成爬虫防护SDK。
iOS SDK文件
联系阿里云技术支持人员获取对应的SDK包后,将其解压至本地。下表描述了解压获得的sdk-iOS文件夹中包含的文件。
文件名 | 说明 |
---|---|
SGMain.framework | 主框架SDK文件 |
SecurityGuardSDK.framework | 基础安全插件 |
SGSecurityBody.framework | 人机识别插件 |
SGAVMP.framework | 虚拟机插件 |
yw_1222_0335_mwua.jpg | 配置文件 |
配置iOS工程
- 引用SDK依赖文件。在iOS工程的依赖库中(Build Phases页签下的Link Binary With Libraries菜单)引入解压SDK包获得的四个.framework文件:
- SGMain.framework
- SecurityGuardSDK.framework
- SGSecurityBody.framework
- SGAVMP.framework
- 添加链接选项。在Build Settings页签下,将 设置为-ObjC。
- 引入系统依赖文件。在iOS工程的依赖库中引入以下文件:
- CoreFoundation.framework
- CoreLocation.framework
- AdSupport.framework
- CoreTelephony.framework
- CoreMotion.framework
- SystemConfiguration.framework
- 引入配置文件。将SDK包中的yw_1222_0335_mwua.jpg配置文件添加到mainbundle目录。
注意 在应用集成多个target的情况下,请确认将
yw_1222_0335_mwua.jpg
配置文件添加到正确的Target Membership中。
调用SDK接口
步骤1:初始化SDK
接口定义:+ (BOOL) initialize;
功能:初始化SDK。
接口参数:无。
返回值:BOOL类型。初始化成功返回YES,失败返回NO。
调用方式:[JAQAVMPSignature initialize];
示例代码
static BOOL avmpInit = NO;
- (BOOL) initAVMP{
@synchronized(self) { // just initialize once
if(avmpInit == YES){
return YES;
}
avmpInit = [JAQAVMPSignature initialize];
return avmpInit;
}
}
步骤2:签名请求数据
接口定义:+ (NSData*) avmpSign: (NSInteger) signType input: (NSData*) input;
功能:使用avmp技术对input的数据进行签名处理,并返回签名串。
警告 被签名的请求体应该与客户端实际发送的请求体完全一致。完全一致的含义包括请求体中字符串的编码格式、空格、特殊字符以及参数的顺序等均一致,否则将导致签名验证失败。
接口参数
名称 | 类型 | 是否必须 | 描述 |
---|---|---|---|
signType | NSInteger | 是 | 签名使用的算法。目前是固定值,填写3 。
|
input | NSData* | 否 | 待签名的数据,一般是整个请求体(request body)。
说明 如果请求体为空(例如POST请求的body为空、或者GET请求),则填写空对象null或空字符串的Bytes值。
|
返回值:NSData*类型,返回签名串。
调用方式:[JAQAVMPSignature avmpSign: 3 input: request_body];
示例代码
说明 客户端向服务器端发送数据时,需要调用avmpSign接口对整个body数据进行签名处理,所得到的签名串就是wToken。
# define VMP_SIGN_WITH_GENERAL_WUA2 (3)
- (NSString*) avmpSign{
@synchronized(self) {
NSString* request_body = @"i am the request body, encrypted or not!";
if(![self initAVMP]){
[self toast:@"Error: init failed"];
return nil;
}
NSString* wToken = nil;
NSData* data = [request_body dataUsingEncoding:NSUTF8StringEncoding];
NSData* sign = [JAQAVMPSignature avmpSign: VMP_SIGN_WITH_GENERAL_WUA2 input:data];
if(sign == nil || sign.length <= 0){
return nil;
}else{
wToken = [[NSString alloc] initWithData:sign encoding: NSUTF8StringEncoding];
return wToken;
}
}
}
如果请求体为空,仍需要调用avmpSign接口生成wToken,第二个参数直接传入空值即可。示例如下: NSData* sign = [JAQAVMPSignature avmpSign: VMP_SIGN_WITH_GENERAL_WUA2 input:nil];
步骤3:将wToken放进协议头
示例代码
#define VMP_SIGN_WITH_GENERAL_WUA2 (3)
-(void)setHeader
{ NSString* request_body = @"i am the request body, encrypted or not!";
NSData* body_data = [request_body dataUsingEncoding:NSUTF8StringEncoding];
NSString* wToken = nil;
NSData* sign = [JAQAVMPSignature avmpSign: VMP_SIGN_WITH_GENERAL_WUA2 input:body_data];
wToken = [[NSString alloc] initWithData:sign encoding: NSUTF8StringEncoding];
NSString *strUrl = [NSString stringWithFormat:@"http://www.aliyundoc.com/login"];
NSURL *url = [NSURL URLWithString:strUrl];
NSMutableURLRequest *request =
[[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20];
[request setHTTPMethod:@"POST"];
// set request body info
[request setHTTPBody:body_data];
// set wToken info to header
[request setValue:wToken forHTTPHeaderField:@"wToken"];
NSURLConnection *mConn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:true];
[mConn start];
// ...
}
步骤4:发送数据到服务器
将修改好协议头的数据发送到云盾,通过解析wToken进行风险识别、拦截恶意请求,然后将合法请求转发回源站。
错误码
上述initialize和avmpSign接口的调用过程中可能出现异常。如果生成签名串异常或失败,请在console中搜索与SG Error相关的错误码信息。
下表描述了常见错误码及含义。
错误码 | 含义 |
---|---|
1901 | 参数不正确,请检查输入的参数。 |
1902 | 图片文件错误。可能是由于BundleID不匹配导致。 |
1903 | 图片文件格式有问题。 |
1904 | 请升级新版本图片。AVMP签名功能仅支持v5图片。 |
1905 | 无法找到图片文件。请确保图片文件yw_1222_0335_mwua.jpg已正确添加在工程中。 |
1906 | 图片中缺少AVMP签名对应的byteCode。请检查使用的图片是否正确。 |
1907 | 初始化AVMP失败,请重试。 |
1910 | 非法的avmpInstance实例。可能由于以下原因导致:
|
1911 | 加密图片的byteCode没有相应导出的函数。 |
1912 | AVMP调用失败,请联系我们。 |
1913 | AVMPInstance被destroy后,调用InvokeAVMP时出现该错误。 |
1915 | AVMP调用内存不足,请重试。 |
1999 | 未知错误,请重试。 |