为iOS应用集成SDK

更新时间:
复制为 MD 格式

参考以下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进行风险识别、拦截恶意请求,然后将合法请求转发回源站。

错误码

上述initializeavmpSign接口的调用过程中可能出现异常。如果生成签名串异常或失败,请在console中搜索与SG Error相关的错误码信息。

下表描述了常见错误码及含义。

错误码

含义

1901

参数不正确,请检查输入的参数。

1902

图片文件错误。可能是由于BundleID不匹配导致。

1903

图片文件格式有问题。

1904

请升级新版本图片。AVMP签名功能仅支持v5图片。

1905

无法找到图片文件。请确保图片文件yw_1222_0335_mwua.jpg已正确添加在工程中。

1906

图片中缺少AVMP签名对应的byteCode。请检查使用的图片是否正确。

1907

初始化AVMP失败,请重试。

1910

非法的avmpInstance实例。可能由于以下原因导致:

  • AVMPInstancedestroy后,调用InvokeAVMP。

  • 图片byteCode版本与SDK不匹配。

1911

加密图片的byteCode没有相应导出的函数。

1912

AVMP调用失败,请联系我们。

1913

AVMPInstancedestroy后,调用InvokeAVMP时出现该错误。

1915

AVMP调用内存不足,请重试。

1999

未知错误,请重试。