参考以下SDK集成说明为您的iOS应用集成爬虫防护SDK。

iOS SDK文件

联系阿里云技术支持人员获取对应的SDK包后,将其解压至本地。下表描述了解压获得的sdk-iOS文件夹中包含的文件。

文件名 说明
SGMain.framework 主框架SDK文件
SecurityGuardSDK.framework 基础安全插件
SGSecurityBody.framework 人机识别插件
SGAVMP.framework 虚拟机插件
yw_1222_0335_mwua.jpg 配置文件

配置iOS工程

  1. 引用SDK依赖文件。在iOS工程的依赖库中(Build Phases页签下的Link Binary With Libraries菜单)引入解压SDK包获得的四个.framework文件:
    • SGMain.framework
    • SecurityGuardSDK.framework
    • SGSecurityBody.framework
    • SGAVMP.framework
    依赖库
  2. 添加链接选项。在Build Settings页签下,将Linking > Other Linker Flags设置为-ObjC链接选项
  3. 引入系统依赖文件。在iOS工程的依赖库中引入以下文件:
    • CoreFoundation.framework
    • CoreLocation.framework
    • AdSupport.framework
    • CoreTelephony.framework
    • CoreMotion.framework
    • SystemConfiguration.framework
    系统依赖库
  4. 引入配置文件。将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实例。可能由于以下原因导致:
  • AVMPInstance被destroy后,调用InvokeAVMP。
  • 图片byteCode版本与SDK不匹配。
1911 加密图片的byteCode没有相应导出的函数。
1912 AVMP调用失败,请联系我们。
1913 AVMPInstance被destroy后,调用InvokeAVMP时出现该错误。
1915 AVMP调用内存不足,请重试。
1999 未知错误,请重试。