iOS WebView 차단 아 약 스 요청
iOS WebView 차단 요청
모두 가 낯 설 지 않 을 것 이 라 고 믿 습 니 다. 이것 은 WebView delegate 에 실현 코드 를 붙 였 습 니 다.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
request = [IBWebMethod formAuthorizationRequest:request];
return [IBWebMethod interceptRequest:request BaseViewController:self];
}
ture or false 는 WebView 가 요청 을 불 러 올 지 여 부 를 결정 합 니 다.new NSURLRequest 를 통 해 원 request 에 사용자 정의 정보 (머리 나 인자) 를 추가 할 수 있 습 니 다.
그러나 Ajax 요청 이 전체 WebView 를 새로 고침 하 는 것 이 아니 기 때문에 위의 방법 에서 캡 처 할 수 없습니다.
그래서 생각 이 났 어 요.StackOverFlow 링크
var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
console.log('mpAjaxHandler://' + this.url);
window.location='mpAjaxHandler://' + this.url;
};
s_ajaxListener.callbackDone = function (state,status) {
console.log('mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url);
window.location='mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url;
};
// Added this function to catch the readyState changes and request
// fake page loads.
function override_onreadystatechange(){
s_ajaxListener.callbackDone(this.readyState);
this.original_onreadystatechange();
}
XMLHttpRequest.prototype.open = function(a,b) {
if (!a) var a='';
if (!b) var b='';
s_ajaxListener.tempOpen.apply(this, arguments);
s_ajaxListener.method = a;
s_ajaxListener.url = b;
if (a.toLowerCase() == 'get') {
s_ajaxListener.data = b.split('?');
s_ajaxListener.data = s_ajaxListener.data[1];
}
}
XMLHttpRequest.prototype.send = function(a,b) {
if (!a) var a='';
if (!b) var b='';
this.setCoustomHeader();
s_ajaxListener.tempSend.apply(this, arguments);
if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
s_ajaxListener.callback();
// Added this to intercept Ajax responses for a given send().
this.original_onreadystatechange = this.onreadystatechange;
this.onreadystatechange = override_onreadystatechange;
}
XML HttpRequest (Ajax) 를 다시 쓴 open 과 send 방법 을 볼 수 있 습 니 다.
그러나 이렇게 하면 나의 요 구 를 만족 시 킬 수 없다. 왜냐하면 Ajax 요청 이 이미 보 냈 기 때문에 우 리 는 Ajax 요청 에 머리 를 넣 어야 한다.
상위 코드
+ (NSString *)jsString:(NSString *)baseString{
return [NSString stringWithFormat:@"%@
XMLHttpRequest.prototype.setCoustomHeader = function(){ this.setRequestHeader(\"Authorization\",\"%@\");}", baseString, [IBDataManager sharedManager].baseAuth];
}
마찬가지 로 js 를 이용 하여 우리 의 머리 를 넣 은 Ajax 요청 에 주입 하여 Ajax 사용자 정의 header 와 캡 처 에 대한 수 요 를 달성 하 였 습 니 다.
iOS UIWebView 는 매우 큰 성능 과 메모리 누 출 문제 가 있 습 니 다. UIWebView 와 WKWebView 를 하나의 API 로 패키지 하여 호출 하 는 것 을 고려 할 수 있 습 니 다.
최근 새로운 수요 와 재 구성 코드 를 개발 하고 있 습 니 다. 이 재 구성 은 WebView 를 따로 꺼 내 BaseWebView Controller 로 만 들 었 습 니 다. 다음 단계 에 UIWebView 와 WKWebView 를 통일 시 킬 준 비 를 하고 있 습 니 다.
열심히, 열심히, 파 이 팅!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.