簡體   English   中英

如何確保使用了我的自定義URL協議?

[英]How to make sure, that my custom URL protocol is used?

根據NSURLSessionConfiguration::protocolClasses的文檔,沒有保證將使用我的自定義url協議。 我如何確保在將其設置為protocolClasses屬性時使用它?

在處理請求之前,NSURLSession對象首先搜索默認協議,然后檢查您的自定義協議,直到找到能夠處理指定請求的協議為止。 它使用canInitWithRequest:類方法返回YES的協議,表明該類能夠處理指定的請求。

我無法使用單個URL協議設置數組,因為它具有canInitWithRequest:方法的邏輯,並且可能無法處理所有請求。

NSArray *currentProtocolClasses = sessionConfiguration.protocolClasses ?: @[];
NSMutableArray *protocolClasses = [NSMutableArray arrayWithArray:currentProtocolClasses];
[protocolClasses insertObject:[CustomURLProtocol class] atIndex:0];
sessionConfiguration.protocolClasses = protocolClasses;

如果文檔這么說,那是一個錯誤。 請提出一個。 邏輯實際上比那里描述的要簡單得多。 基本上,操作系統是這樣的:

NSURLProtocol *protocol = nil;
for (Class protocolClass in sessionConfiguration.protocolClasses) {
    if ([protocolClass canInitWithRequest:request]) {
         protocol = [[protocolClass alloc] init];
    }
}
if (!protocol) {
    fail
}

因此,只要您的協議列在第一位,它們就會獲得優先權。 (對於NSURLConnection,該文檔的那部分內容也是錯誤的;始終會在所有內置協議之前首先詢問您注冊的協議。)

如果您不需要處理標准協議,則只需執行以下操作:

sessionConfiguration.protocolClasses = @[[CustomURLProtocol class]];

您不能強制使用URL協議。 僅當其canInitWithRequest:類方法對該請求返回YES時,才會使用該協議。 如果您想讓其他協議處理請求(例如,如果您想定義一個真正使用普通https請求的自定義URL方案),則通常可以通過編寫一個協議來重寫URL並在其中重新發出請求來實現。一個沒有安裝協議處理程序類的新會話。

或者,您可以在確實安裝了處理程序的會話中重新發出請求,只要您以某種方式修改了請求,以便協議處理程序在第二次看到請求時便知道其canInitWithRequest:方法返回NO。 (否則,您將獲得無限遞歸。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM