このトピックでは、Anti-Bot SDKをiOSアプリに統合する方法について説明します。 このトピックでは、Anti-Bot SDKをSDKと呼びます。 iOSアプリのWeb Application Firewall (WAF) のアプリ保護機能を有効にする前に、SDKをiOSアプリに統合する必要があります。
制限事項
iOSアプリはiOS 9.0以降を使用する必要があります。 iOSバージョンが9.0より前の場合、SDKをiOSアプリに統合することはできません。
前提条件
- アプリ保護機能が購入され、有効になります。
詳細については、「アプリ保護を有効にする手順」をご参照ください。
iOSアプリ用のSDKが取得されました。
iOSアプリ用のSDKを取得するには、
テクニカルサポートを得るためのチケット。SDKは、IDFA (Identifier for Advertising) と非IDFAの2つのバージョンをサポートしています。 次のSDKファイルがバージョン用に提供されています。
AliTigerTally_IDFA.framework
AliTigerTally_NOIDFA.framework
IDFAバージョンを使用する場合は、AliTigerTally_IDFAバージョンのSDKをiOSアプリに統合することを推奨します。 非IDFAバージョンを使用する場合は、AliTigerTally_NOIDFAバージョンのSDKをiOSアプリに統合することを推奨します。
- SDK認証キー、すなわち
アプリキー
を取得する。アプリキーを取得するには、Web Application Firewallコンソールにログインし、 を選択します。 [Webサイト保護] ページの [ボット管理] タブで、[アプリ保護] をオンにし、[Appkeyの取得とコピー] をクリックします。 SDK認証キーは、SDK初期化要求の送信に使用されます。 キーは統合コードに含まれている必要があります。説明 各Alibaba Cloudアカウントには一意のアプリキー
があり、WAFインスタンスのすべてのドメイン名に使用できます。 SDKをAndroidアプリに統合するかiOSアプリに統合するかに関係なく、アプリキー
を使用できます。認証キーの例:**** OpKLvM6zliu6KopyHIhmneb_**** u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_**** vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK ****
背景情報
SDKは、アプリクライアントから送信されるリクエストに署名するために使用されます。 WAFはリクエストシグネチャを検証して、悪意のあるリクエストを検出およびブロックします。
(オプション) テストiOSプロジェクトを作成する
SDKを実際のiOSプロジェクトに統合できます。 SDKをテストiOSプロジェクトに統合して、SDKを実際のiOSプロジェクトに統合する前に、統合操作について学ぶこともできます。
この例では、Xcodeを使用してテストiOSプロジェクトを作成します。
次の図は、TigerTally_sdk_testという名前のテストプロジェクトを示しています。
手順
Xcodeを使用してテストiOSプロジェクトを開き、ファイルディレクトリを入力します。
SDKをプロジェクトにコピーします。
依存関係ライブラリをプロジェクトに追加します。
依存ライブラリ
非IDFAバージョンに必要
IDFAバージョンに必要
libc ++.tbd
可
可
CoreTelephony.framework
可
可
libresolv.9.tbd
可
可
AdSupport.framework
任意
可
をクリックし、ビルド設定タブを追加し、-ObjCへのリンカフラグその他のリンカーフラグ設定します。
統合コードを追加します。
SDKを統合するソースファイルにヘッダーファイルを追加します。
サンプルコード:
Objective-C
// 非IDFAバージョン # import <AliTigerTally_NOIDFA/AliTigerTally.h> // IDFAバージョン # import <AliTigerTally_IDFA/AliTigerTally.h>
Swift
// ヘッダーファイルを作成します。 # ifndef TigerTally_sdk_Swift_h # define TigerTally_sdk_Swift_h // 非IDFAバージョン # import <AliTigerTally_NOIDFA/AliTigerTally.h> // IDFAバージョン # import <AliTigerTally_IDFA/AliTigerTally.h> # endif /* TigerTally_sdk_Swift_h */
作成したヘッダーファイルを、ビルド設定の [Objective-C Bridging header] オプションに追加します。
ユーザーIDを指定します。
構文:
-(void)setAccount :( NSString *) アカウント
説明: リクエストに含めるユーザーIDを指定します。 これにより、WAF保護ポリシーをより効率的に構成できます。
パラメーター: <account> 。ユーザーIDを指定します。 データ型: NSString * 。 マスクされたユーザーIDを入力することを推奨します。
戻り値: なし。
サンプルコード:
Objective-C
// この例では、ユーザーIDとしてtestAccountが使用されます。 // ゲストユーザーのユーザーIDを指定するためにsetAccount関数を呼び出す必要はありません。 initialize関数を直接呼び出して、SDKを初期化できます。 [[AliTigerTally sharedInstance] setAccount:@ "testAccount"];
Swift
// この例では、ユーザーIDとしてtestAccountが使用されます。 // ゲストユーザーのユーザーIDを指定するためにsetAccount関数を呼び出す必要はありません。 initialize関数を直接呼び出して、SDKを初期化できます。 AliTigerTally.sharedInstance().setAccount("testAccount")
SDKを初期化します。
構文:
-(bool)initialize :( NSString *)appKey
説明: SDKを初期化し、端末情報を収集します。 端末情報を再収集する場合は、initialize関数を呼び出します。
パラメーター: <appKey> 。SDK認証キーを指定します。 データ型: NSString * 。
戻り値: BOOLEAN型の値が返されます。 有効な値は、true および false です。 値trueは、初期化が成功したことを示します。 値falseは、初期化が失敗したことを示します。
サンプルコード:
Objective-C
NSString * appKey=@ "**** OpKLvM6zliu6KopyHIhmneb_**** u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_**** vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK ****"; if([[AliTigerTally sharedInstance]initialize:appKey]){ NSLog(@ "初期化は成功です。"); }else{ NSLog(@ "初期化に失敗しました。"); }
Swift
let binit = AliTigerTally.sharedInstance().initialize("**** OpKLvM6zliu6KopyHIhmneb_**** u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_**** vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK ****") if(binit){ NSLog("初期化は成功です。"); } else { NSLog("初期化に失敗しました。"); }
サインリクエスト。
構文:
-(NSString *)vmpSign :( NSData *)inputBody
説明: 入力データに署名し、署名文字列を返します。
パラメーター: <inputBody> 。署名するデータを指定します。 データ型: NSData * 。
有効な値:
一般的なシナリオでの戻り値: 署名文字列が返されます。 データ型: NSString * 。
異常なシナリオでの戻り値:
戻り値
説明
解決策
initializeを呼び出す必要があります
initialize
関数は呼び出されません。initialize
関数を呼び出して、SDKを初期化します。 次に、vmpSign
関数を呼び出します。you must input body
署名するデータが指定されていません。
vmpSign
関数を呼び出すときに、<inputBody> パラメーターを設定して、署名するデータを指定します。NULL
初期化が完了せず、データの署名に失敗しました。
vmpSign
関数を再度呼び出します。
サンプルコード:
説明次のサンプルコードでは、署名文字列はwTokenとして定義されています。
Objective-C
if(![[AliTigerTally sharedInstance]initialize:@ "**** OpKLvM6zliu6KopyHIhmneb_**** u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_**** vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK ****"]) { NSLog(@ "初期化に失敗しました。"); 戻ります。} NSString * signBody =@ "hello"; NSString * wToken= [[AliTigerTally sharedInstance] vmpSign:[signBody dataUsingEncoding:NSUTF8StringEncoding]]; NSLog(@ "wToken== % @",wToken);
Swift
if(!AliTigerTally.sharedInstance().initialize("**** OpKLvM6zliu6KopyHIhmneb_**** u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_**** vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK ****)){ NSLog("初期化に失敗しました。"); リターン } let signBody = "hello" var token = AliTigerTally.sharedInstance().vmpSign(signData) NSLog (トークン);
署名文字列をプロトコルヘッダーに追加し、iOSアプリのサーバーにリクエストを送信します。
署名文字列は、クライアントのログオンイベントの要求など、ビジネスクリティカルなイベントでサーバーに送信されます。 WAFは、サーバーに送信されたリクエストを受信し、署名文字列wTokenを解析して悪意のあるリクエストを識別してブロックし、通常のリクエストをサーバーに転送します。
サンプルコード:
Objective-C
NSURL * url = [NSURL URLWithString:@ "https:// xxxxxx/test?id=123"]; NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; [リクエストsetValue: wToken forHTTPHeaderField: @ "wToken"]; request.HTTPMethod=@ "post"; request.HTTPBody=[signBody dataUsingEncoding:NSUTF8StringEncoding]; NSURLSessionDataTask * dataTask = [[NSURLSessionsharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (エラー) { NSLog(@ "データの送信に失敗しました。% @" 、エラー); } else { NSLog(@ "データは送信されます。"); } }]; [dataTask resume];
Swift
guard let url = URL (文字列: "https:// xxxxxx/test?id=123") else { return} var request = URLRequest(url: url) request.httpMethod = "POST" request.addValue(token, forHTTPHeaderField: "wToken") let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in let data = data { do { プリント ("OK") } catch { プリント ("エラー") print (エラー) } } }.resume() }