iOS WebView 차단 아 약 스 요청

3364 단어
제목: iOS WebView 차단 Ajax 요청 날짜: 2016 - 04 - 12 00: 08: 11 태그: [OS, Ajax, WebView] desc: iOS WebView 를 이용 하여 js 차단 Ajax 요청 주입
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 를 통일 시 킬 준 비 를 하고 있 습 니 다.
열심히, 열심히, 파 이 팅!

좋은 웹페이지 즐겨찾기