SDWebImage探究(十五) —— 深入研究圖片下載流程(九)之身份驗證質詢代理方法調用

版本記錄

版本號 時間
V1.0 2018.02.25

前言

我們做APP邻眷,文字和圖片是絕對不可缺少的元素剔交,特別是圖片一般存儲在圖床里面岖常,一般公司可以委托第三方保存,NB的公司也可以自己存儲圖片,ios有很多圖片加載的第三方框架,其中最優(yōu)秀的莫過于SDWebImage冯乘,它幾乎可以滿足你所有的需求,用了好幾年這個框架晒夹,今天想總結一下惋戏。感興趣的可以看其他幾篇。
1. SDWebImage探究(一)
2. SDWebImage探究(二)
3. SDWebImage探究(三)
4. SDWebImage探究(四)
5. SDWebImage探究(五)
6. SDWebImage探究(六) —— 圖片類型判斷深入研究
7. SDWebImage探究(七) —— 深入研究圖片下載流程(一)之有關option的位移枚舉的說明
8. SDWebImage探究(八) —— 深入研究圖片下載流程(二)之開始下載并返回下載結果的總的方法
9. SDWebImage探究(九) —— 深入研究圖片下載流程(三)之下載之前的緩存查詢操作
10. SDWebImage探究(十) —— 深入研究圖片下載流程(四)之查詢緩存后的block回調處理
11. SDWebImage探究(十一) —— 深入研究圖片下載流程(五)之SDWebImageDownloadToken和操作對象的生成和返回
12. SDWebImage探究(十二) —— 深入研究圖片下載流程(六)之下載器到具體下載操作的代理分發(fā)實現(xiàn)
13. SDWebImage探究(十三) —— 深入研究圖片下載流程(七)之NSURLSession中幾個代理的基本用法和關系
14. SDWebImage探究(十四) —— 深入研究圖片下載流程(八)之下載完成代理方法的調用

SDWebImageDownloaderOperation中身份驗證質詢代理方法

該代理方法主要用于:該任務已收到請求特定的身份驗證質詢

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler;
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
    
    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
    __block NSURLCredential *credential = nil;
    
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates)) {
            disposition = NSURLSessionAuthChallengePerformDefaultHandling;
        } else {
            credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            disposition = NSURLSessionAuthChallengeUseCredential;
        }
    } else {
        if (challenge.previousFailureCount == 0) {
            if (self.credential) {
                credential = self.credential;
                disposition = NSURLSessionAuthChallengeUseCredential;
            } else {
                disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
            }
        } else {
            disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
        }
    }
    
    if (completionHandler) {
        completionHandler(disposition, credential);
    }
}

該代理方法主要做一下幾個工作:

  • 構造參數(shù)NSURLSessionAuthChallengeDisposition dispositionNSURLCredential *credential
  • 回調block completionHandler舔亭,將上面獲取的參數(shù)作為輸入?yún)?shù)傳遞completionHandler(disposition, credential)蟀俊。

disposition和credential參數(shù)的構建

1. NSURLSessionAuthChallengeDisposition枚舉

NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
__block NSURLCredential *credential = nil;

首先我們要看一下NSURLSessionAuthChallengeDisposition這個枚舉订雾。首先看一下API然后在看其用法。

typedef NS_ENUM(NSInteger, NSURLSessionAuthChallengeDisposition) {
    NSURLSessionAuthChallengeUseCredential = 0,                                       
    /* Use the specified credential, which may be nil */
    //使用指定的credential洼哎,可能為nil
    
    NSURLSessionAuthChallengePerformDefaultHandling = 1,                              
    /* Default handling for the challenge - as if this delegate were not implemented; the credential parameter is ignored. */
    //挑戰(zhàn)challenge的默認處理 - 就好像這個代理沒有實現(xiàn)噩峦,憑證credential參數(shù)被忽略
    
    NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,                      
    /* The entire request will be canceled; the credential parameter is ignored. */
    // 整個的請求將被取消,忽略credential參數(shù)族淮。
    
    NSURLSessionAuthChallengeRejectProtectionSpace = 3,                               
    /* This challenge is rejected and the next authentication protection space should be tried; the credential parameter is ignored. */
    //這個挑戰(zhàn)被拒絕祝辣,并且應該嘗試下一個認證保護空間蝙斜; 憑證credential參數(shù)被忽略
} NS_ENUM_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0);

這里其實就是用來進行身份驗證的白翻,這個和HTTP還有HTTPS有關滤馍,大家都知道HTTPS更安全底循,很多國際大公司都提倡使用HTTPS。下面兩張圖可以很明顯的說明二者的區(qū)別阁苞,圖片來源網(wǎng)絡那槽,后面已經增加引用參考說明等舔。

從上面可以看見甚牲,由于增加受保護空間以及公鑰的加密,信息在相對更安全的路徑進行傳輸非驮。

下面回到SDWebImage中雏赦,處理方式disposition首先默認取值NSURLSessionAuthChallengePerformDefaultHandling喉誊,這個的意思就是使用默認方式進行處理,其實這就相當于一個變量的初始化栋盹。

2. if條件判斷

if條件判斷主要對應下面這一小段代碼例获。

if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
    if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates)) {
        disposition = NSURLSessionAuthChallengePerformDefaultHandling;
    }
    else {
        credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        disposition = NSURLSessionAuthChallengeUseCredential;
    }
}

首先看一下判斷條件[challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]

/*!
    @const NSURLAuthenticationMethodServerTrust
    @abstract SecTrustRef validation required.  Applies to any protocol.
 */
FOUNDATION_EXPORT NSString * const NSURLAuthenticationMethodServerTrust API_AVAILABLE(macos(10.6), ios(3.0), watchos(2.0), tvos(9.0));

這個判斷條件的作用就是判斷服務器返回的證書是否是服務器信任的榨汤。

如果是信任的收壕,接著進行判斷轨蛤,如果options不是SDWebImageDownloaderAllowInvalidSSLCertificates

/**
 * Enable to allow untrusted SSL certificates.
 * Useful for testing purposes. Use with caution in production.
 */
SDWebImageDownloaderAllowInvalidSSLCertificates = 1 << 6,

也就是不允許無效的證書圃验,那么disposition = NSURLSessionAuthChallengePerformDefaultHandling澳窑,確定處理方式這個參數(shù)的值摊聋。如果options是SDWebImageDownloaderAllowInvalidSSLCertificates呢栈暇,也就是允許無效的整數(shù),那么按照下面進行處理悲立。

credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
disposition = NSURLSessionAuthChallengeUseCredential;

實例化新的NSURLCredential證書,并且設置dispose為使用指定的證書這個枚舉值NSURLSessionAuthChallengeUseCredential薪夕,在這一點上都是類似的原献,AFN有一部分也是這么做的。

3. else條件判斷

如果服務器返回的證書不是服務器信任的写隶。那么慕趴,按照下面這小段邏輯進行處理鄙陡。

else {
        if (challenge.previousFailureCount == 0) {
            if (self.credential) {
                credential = self.credential;
                disposition = NSURLSessionAuthChallengeUseCredential;
            } else {
                disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
            }
        } else {
            disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
        }
    }

這里首先判斷以前的質詢次數(shù)趁矾,對應previousFailureCount這個屬性。

/*!
    @abstract Get count of previous failed authentication attempts
    @result The count of previous failures
*/
@property (readonly) NSInteger previousFailureCount;

如果質詢失敗次數(shù)為0详拙,接著進行判斷饶辙,如果有證書牌柄,那么disposition = NSURLSessionAuthChallengeUseCredential;珊佣,如果沒有證書披粟,那么disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;,也就是整個的請求將被取消惑艇,忽略credential參數(shù)滨巴。

如果質詢失敗次數(shù)不為0,那么disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;泰偿,作用同上耗跛。


completionHandler回調

上面的參數(shù)構建完畢后攒发,緊接著就是completionHandler這個block的回調「崂回調就是這兩個參數(shù)偶妖,處理方式和證書completionHandler(disposition, credential);

參考文章

1. iOS - HTTPS
2. 打造安全的App餐屎!iOS安全系列之 HTTPS

后記

本篇主要解析的就是質詢時候的代理處理方法,構造disposition和credential兩個參數(shù)屿聋,并且回調作為輸入?yún)?shù)傳過去藏鹊。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末盘寡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脆粥,更是在濱河造成了極大的恐慌变隔,老刑警劉巖蟹倾,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肌厨,居然都是意外死亡,警方通過查閱死者的電腦和手機检柬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門何址,熙熙樓的掌柜王于貴愁眉苦臉地迎上來进胯,“玉大人胁镐,你說我怎么就攤上這事∑溺瑁” “怎么了就缆?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵竭宰,是天一觀的道長。 經常有香客問我狞甚,道長廓旬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮巩步,結果婚禮上桦踊,老公的妹妹穿的比我還像新娘。我一直安慰自己竟闪,他們只是感情好,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著理朋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗽上。 梳的紋絲不亂的頭發(fā)上兽愤,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天浅萧,我揣著相機與錄音,去河邊找鬼洼畅。 笑死,一個胖子當著我的面吹牛务热,可吹牛的內容都是我干的己儒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼途样!你這毒婦竟也來了何暇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤条辟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后本姥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杭棵,經...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡魂爪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年密浑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尔破。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡懒构,死狀恐怖胆剧,靈堂內的尸體忽然破棺而出秩霍,到底是詐尸還是另有隱情,我是刑警寧澤铃绒,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布颠悬,位于F島的核電站定血,受9級特大地震影響澜沟,放射性物質發(fā)生泄漏。R本人自食惡果不足惜茫虽,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贤壁。 院中可真熱鬧埠忘,春花似錦莹妒、人聲如沸绰上。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爽哎。三九已至课锌,卻和暖如春祈秕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背志鞍。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兼丰,地道東北人鳍征。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓艳丛,卻偏偏與公主長得像趟紊,于是被迫代替她去往敵國和親霎匈。 傳聞我的和親對象是個殘疾皇子铛嘱,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內容