O Anti-Bot SDK assina cada requisição do seu aplicativo iOS. O WAF verifica essa assinatura para detectar e bloquear tráfego de bots antes que ele chegue ao servidor.
Pré-requisitos
Antes de começar, verifique se você tem:
iOS 9.0 ou posterior nos dispositivos de destino
App Protection adquirido e ativado. Consulte Procedure to enable App Protection
Pacote do SDK para iOS (
AliTigerTally_IDFA.frameworkouAliTigerTally_NOIDFA.framework). Envie um ticket para obter o SDKSua app key. Para obtê-la, faça login no console do WAF, acesse Protection Configurations > Website Protection, abra a aba Bot Management, ative App Protection e clique em Obtain and Copy Appkey
Cada conta Alibaba Cloud tem uma única app key, compartilhada entre todos os nomes de domínio da instância do WAF. A mesma app key funciona tanto para aplicativos Android quanto iOS.

Exemplo de app key:
****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****
Escolher uma versão do SDK
O SDK está disponível em duas versões, conforme o uso do Identifier for Advertisers (IDFA) pelo aplicativo:
|
Versão |
Arquivo do framework |
Quando usar |
|
IDFA |
|
O aplicativo usa IDFA |
|
Non-IDFA |
|
O aplicativo não usa IDFA |
Como funciona
O SDK assina o corpo da requisição com
vmpSigne retorna um token de assinatura (wToken).O aplicativo anexa o
wTokenao cabeçalho da requisição HTTP e a envia.O WAF analisa o
wTokenem cada requisição recebida, bloqueia o tráfego malicioso e encaminha as legítimas ao servidor.
Assine requisições em eventos críticos para o negócio, como login, envio de pagamento ou qualquer ação que exija proteção.
Integrar o SDK
Etapa 1: Configurar o projeto no Xcode
Abra o projeto iOS no Xcode e copie o framework do SDK para o diretório do projeto.
Etapa 2: Adicionar bibliotecas de dependência
Adicione as seguintes bibliotecas ao target:
|
Biblioteca |
Versão Non-IDFA |
Versão IDFA |
|
|
Obrigatória |
Obrigatória |
|
|
Obrigatória |
Obrigatória |
|
|
Obrigatória |
Obrigatória |
|
|
Não obrigatória |
Obrigatória |
Etapa 3: Adicionar a flag de linker -ObjC
Em Build Settings, adicione -ObjC em Other Linker Flags.
Etapa 4: Importar o header do SDK
Objective-C — adicione o import em qualquer arquivo source que chame o SDK:
// Non-IDFA version
#import <AliTigerTally_NOIDFA/AliTigerTally.h>
// IDFA version
#import <AliTigerTally_IDFA/AliTigerTally.h>
Swift — crie um arquivo de bridging header e adicione o import:
#ifndef TigerTally_sdk_Swift_h
#define TigerTally_sdk_Swift_h
// Non-IDFA version
#import <AliTigerTally_NOIDFA/AliTigerTally.h>
// IDFA version
#import <AliTigerTally_IDFA/AliTigerTally.h>
#endif /* TigerTally_sdk_Swift_h */
Em seguida, defina o caminho do bridging header em Build Settings > Objective-C Bridging Header.
Etapa 5: Definir um user ID (opcional)
Chame setAccount para associar um user ID às requisições do SDK. Isso permite criar políticas de proteção do WAF mais granulares. Para usuários convidados, ignore esta chamada e vá diretamente para initialize.
Sintaxe:
-(void)setAccount:(NSString*)account
|
Parâmetro |
Tipo |
Descrição |
|
|
|
User ID. Utilize um valor mascarado em vez de um identificador direto. |
Objective-C:
// Use a masked user ID
[[AliTigerTally sharedInstance] setAccount:@"testAccount"];
Swift:
AliTigerTally.sharedInstance().setAccount("testAccount")
Etapa 6: Inicializar o SDK
Chame initialize com a app key para iniciar o SDK e coletar informações do dispositivo. Repita a chamada sempre que precisar atualizar essas informações.
Sintaxe:
-(bool)initialize:(NSString*)appKey
|
Parâmetro |
Tipo |
Descrição |
|
|
|
Chave de autenticação do SDK. |
Retorna true em caso de sucesso e false em caso de falha.
Objective-C:
NSString *appKey = @"****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****";
if ([[AliTigerTally sharedInstance] initialize:appKey]) {
NSLog(@"Initialization successful.");
} else {
NSLog(@"Initialization failed.");
}
Swift:
let binit = AliTigerTally.sharedInstance().initialize("****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****")
if binit {
NSLog("Initialization successful.")
} else {
NSLog("Initialization failed.")
}
Etapa 7: Assinar requisições
Chame vmpSign para gerar um token de assinatura para o corpo da requisição.
Sintaxe:
-(NSString*)vmpSign:(NSData*)inputBody
|
Parâmetro |
Tipo |
Descrição |
|
|
|
Corpo da requisição a ser assinado. |
Retorna uma string de assinatura (NSString*) em caso de sucesso. Essa assinatura é denominada wToken.
Valores de retorno de erro:
|
Valor de retorno |
Causa |
Correção |
|
|
|
Chame |
|
|
|
Passe o corpo da requisição ao chamar |
|
|
Inicialização incompleta |
Chame |
Objective-C:
if (![[AliTigerTally sharedInstance] initialize:@"****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****"]) {
NSLog(@"Initialization failed.");
return;
}
NSString *signBody = @"hello";
NSString *wToken = [[AliTigerTally sharedInstance] vmpSign:[signBody dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"wToken: %@", wToken);
Swift:
if !AliTigerTally.sharedInstance().initialize("****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****") {
NSLog("Initialization failed.")
return
}
let signBody = "hello"
let token = AliTigerTally.sharedInstance().vmpSign(signData)
NSLog(token)
Etapa 8: Enviar a requisição assinada
Adicione o wToken ao cabeçalho da requisição HTTP e envie-a.
Objective-C:
NSURL *url = [NSURL URLWithString:@"https://xxxxxx/test?id=123"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10];
[request setValue:wToken forHTTPHeaderField:@"wToken"];
request.HTTPMethod = @"post";
request.HTTPBody = [signBody dataUsingEncoding:NSUTF8StringEncoding];
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Request failed: %@", error);
} else {
NSLog(@"Request sent.");
}
}];
[dataTask resume];
Swift:
guard let url = URL(string: "https://xxxxxx/test?id=123") else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue(token, forHTTPHeaderField: "wToken")
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Request failed: \(error)")
} else {
print("Request sent.")
}
}.resume()
(Opcional) Testar com um projeto de exemplo
Antes de integrar ao aplicativo de produção, crie um projeto de teste iOS no Xcode para validar as etapas de integração.
O código abaixo pertence a um exemplo de ViewController.m em um projeto de teste chamado TigerTally_sdk_test:
//
// ViewController.m
// TigerTally_sdk_test
//
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup a...
}
@end