全部產品
Search
文件中心

:iOS應用整合SDK

更新時間:Jul 01, 2024

本文介紹了為您的iOS應用整合WAF App防護SDK(以下簡稱SDK)的操作方法。您必須在應用中整合SDK,才能為應用開啟App防護。

使用限制

iOS應用對應的iOS版本是9.0及以上,否則不支援整合App防護SDK。

前提條件

  • 已開通WAF App防護模組且開啟了App防護狀態開關。

    相關操作,請參見如何為應用開啟App防護

  • 已擷取iOS應用對應的SDK。

    您開通WAF App防護模組後,請提交工單,聯絡產品技術專家擷取SDK。

    iOS應用對應的SDK分為廣告標識符(Identifier for Advertising,簡稱IDFA)版本和非IDFA版本,對應的SDK檔案分別是:

    • AliTigerTally_IDFA.framework

    • AliTigerTally_NOIDFA.framework

    如果您的iOS專案中使用了IDFA,推薦您整合AliTigerTally_IDFA版本SDK,否則請使用AliTigerTally_NOIDFA版本SDK。

  • 已擷取SDK認證密鑰(即appkey)。

    您在Web Application Firewall控制台防護配置 > 網站防護頁面開啟App防護後,即可單擊擷取並複製appkey,擷取SDK認證密鑰。該密鑰用於發起SDK初始化請求,需要在整合代碼中使用。

    說明

    每個阿里雲帳號擁有唯一的appkey(適用於所有接入WAF防護的網域名稱),且Android和iOS應用整合SDK時都使用該appkey

    App防護

    認證密鑰樣本:

    ****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****

背景資訊

App防護SDK主要用於對通過App用戶端發起的請求進行簽名。WAF服務端通過校正App請求籤名,識別App業務中的風險、攔截惡意請求,實現App防護的目的。

建立一個測試工程(可選)

您可以直接在真實的iOS工程中整合SDK,或者先建立一個測試工程進行測試,等熟悉操作後,再在真實環境中進行操作。

以Xcode環境為例,建立一個iOS工程,並按照設定精靈完成建立。

本文將測試工程命名為TigerTally_sdk_test,建立好的工程目錄如下圖所示。測試Demo

操作步驟

  1. 使用Xcode開啟App工程,進入檔案目錄。

  2. 將SDK複製到專案中。

  3. 在專案中添加以下依賴庫。

    依賴庫

    非IDFA版本是否需要

    IDFA版本是否需要

    libc++.tbd

    CoreTelephony.framework

    libresolv.9.tbd

    AdSupport.framework

  4. 開啟編譯選項設定(Build Settings),在Other Linker Flags選項中添加-ObjC

  5. 添加整合代碼。

    1. 在需要整合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 */

        您需要在編譯選項設定(Build Settings)的Objective-C Bridging Header選項中,添加已建立的標頭檔。

    2. 設定使用者標識。

      介面定義:

      -(void)setAccount:(NSString*)account

      功能:設定您業務中自訂的終端使用者標識,方便您更靈活地配置WAF防護策略。

      介面參數:<account>,NSString*類型,表示標識一個使用者的字串(建議您使用脫敏後的格式)。

      傳回值:無。

      範例程式碼:

      • Objective-C語言

        // testAccount表示使用者標識字串樣本。
        // 如果當前登入的使用者是遊客身份,可以跳過這步,直接調用初始化函數。
        [[AliTigerTally sharedInstance] setAccount:@"testAccount"]; 
      • Swift語言

        // testAccount表示使用者標識字串樣本。
        // 如果當前登入的使用者是遊客身份,可以跳過這步,直接調用初始化函數。
        AliTigerTally.sharedInstance().setAccount("testAccount")
    3. 添加初始化函數。

      介面定義:

      -(bool)initialize:(NSString*)appKey

      功能:初始化SDK,執行一次初始化採集。一次初始化採集表示採集一次終端裝置資訊,您可以根據業務的不同,重新調用initialize函數進行初始化採集。

      介面參數:<appKey>,NSString*類型,設定成您的SDK認證密鑰。

      傳回值:bool類型,返回是否初始化成功,true表示成功,false表示失敗。

      範例程式碼:

      • Objective-C語言

        NSString *appKey=@"****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****";
        if([[AliTigerTally sharedInstance]initialize:appKey]){
            NSLog(@"初始化成功");
         }else{
             NSLog(@"初始化失敗");
        }
      • Swift語言

        let binit = AliTigerTally.sharedInstance().initialize("****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****")
        if(binit){
            NSLog("初始化成功");
        }else{
            NSLog("初始化失敗");
        }
    4. 簽章要求資料。

      介面定義:

      -(NSString*)vmpSign:(NSData*)inputBody

      功能:對輸入的資料進行簽名,並且返回簽名串。

      介面參數:<inputBody>,NSData*類型,表示待簽名的資料體。

      傳回值:

      • 正常返回結果:NSString* 類型,返回簽名串。

      • 異常返回結果:

        返回結果

        說明

        建議操作

        you must call initialize

        表示您沒有調用initialize函數。

        請先調用initialize函數初始化SDK,然後再調用vmpSign函數。

        you must input body

        表示您沒有設定待簽名的資料體。

        您在調用vmpSign函數時,必須設定要簽名的資料體(<inputBody>)。

        NULL

        表示初始化未完成,簽名失敗。

        建議您重新調用vmpSign函數。

      範例程式碼:

      說明

      範例程式碼中將簽名串定義為wToken

      • Objective-C語言

        if(![[AliTigerTally sharedInstance]initialize:@"****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****"])
        {
                NSLog(@"初始化失敗");
                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("初始化失敗");
           return
        } 
        let signBody = "hello"
        var token = AliTigerTally.sharedInstance().vmpSign(signData)
        NSLog(token);
    5. 將簽名串添加到協議頭,並發送資料到伺服器。

      在業務關鍵事件(例如,用戶端登入請求事件)中,將簽名串提交到應用伺服器。WAF服務端在擷取應用伺服器收到的請求後,通過解析簽名串(wToken)進行風險識別、攔截惡意請求,然後將合法請求轉寄回來源站點。

      範例程式碼:

      • 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 * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            if(error){
                NSLog(@"發送失敗%@", error);
            }else
            {
                NSLog(@"發送成功");
            }
        }];
        [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")
        let session = URLSession.shared
        session.dataTask(with: request) { (data, response, error) in
            if let data = data {
                do {
                    print("OK")
                } catch {
                    print("ERROR")
                    print(error)
                }
            }
        
        }.resume()
        }