iOS UIWebview新增請求頭的兩種方式
1、在UIWebviewDelegate的方法中攔截request,設定request的請求頭,廢話不多說看程式碼:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *urlString = [[request URL] absoluteString];
NSLog(@"==> %@",urlString);
NSMutableURLRequest *mutableRequest = [request mutableCopy];
NSDictionary *requestHeaders = request.allHTTPHeaderFields;
// 判斷請求頭是否已包含,如果不判斷該欄位會導致webview載入時死迴圈
if (requestHeaders[@"token"] && requestHeaders[@"clienttype"]) {
return YES;
} else {
[mutableRequest setValue:@"token" forHTTPHeaderField:@"token"];
[mutableRequest setValue:@"ios" forHTTPHeaderField:@"clienttype"];
request = [mutableRequest copy];
[webView loadRequest:request];
return NO;
}
return YES;
}
經過本人親測,這樣做有一定問題,當在webview執行goBack方法時導致兩個介面相互載入的情況,導致死迴圈載入無法返回,解決方法請參考以下更牛逼的方法2
2、寫一個類繼承NSURLProtocol,在 + (BOOL)canInitWithRequest:(NSURLRequest *)request 方法攔截request為request新增請求頭,這樣所有的webview操作請求都會調到這裡,為request新增請求頭,而且不影響webview的goBack方法返回
#import <Foundation/Foundation.h>
@interface KJURLProtocol : NSURLProtocol
@end
#import "KJURLProtocol.h"
@implementation KJURLProtocol
+ (void)load {
[NSURLProtocol registerClass:self];
}
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
if ([request isKindOfClass:[NSMutableURLRequest class]]) {
[(id)request setValue:@"ios" forHTTPHeaderField:@"clienttype"];
[(id)request setValue:[KJAppData instance].token forHTTPHeaderField:@"token"];
}
return NO;
}
@end
/********************************************************************************/
+ (BOOL)canInitWithRequest:(NSURLRequest *)request //在此方法決定是否攔截請求,return yes為攔截
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request //在此方法修改請求並返回
- (void)startLoading //執行特定的request請求
- (void)stopLoading //中斷特定的request請求
/********************************************************************************/
附:iOS8一會蘋果推出一個載入網頁檢視更吊的框架WebKit,其中的WKWebView 基本包含了UIWebview的所有東西,據說在效能方面優化的不是一點點,並添加了很多主流的東西,例如:實現網頁之間的側滑返回,估算網頁的載入進度,如果你的應用已經最低支援iOS8,你還在由於什麼,趕快嘗試吧。
詳解參考:http://www.tuicool.com/articles/FJ3Ave7
wkwebview問題: http://www.cnblogs.com/NSong/p/6489802.html
NSURLProtocol監聽 wkwebview請求 解決辦法:http://www.tuicool.com/articles/J7ZRF3i