짧은 답변 :
shouldStartLoadWithRequest
당신이 (당신의 코드에서 판단, 당신이 궁극적으로 그것을 여는거야 특히 이후 연결됩니다 어떤 사이트에 파악을위한 훌륭한 메커니즘없는 UIWebViewDelegate
방법을 사용하여 외부 앱이 아니라 UIWebView
) 리디렉션이 발생하기 전에 shouldStartLoadWithRequest
이 나오기 때문입니다. 하지만 NSURLConnection
및 NSURLConnectionDataDelegate
방법을 사용하면 결국 리디렉션되는 위치를 파악할 수 있습니다.
긴 대답은 : 당신이 YES
을 반환 할 경우, shouldStartLoadWithRequest
보면
, 당신은 UIWebView
리디렉션 요청에 따라 드리겠습니다. 고려 shouldStartLoadWithRequest
다음 shouldStartLoadWithRequest
에 세 번째 호출은 실제입니다
2013-03-12 21:23:31.418 webtest[6959:c07] http://nyti.ms/Yi6EAk
2013-03-12 21:23:31.511 webtest[6959:c07] http://bit.ly/Yi6EAk?cc=0d7134b272b1004cb954d0400076e9fa
2013-03-12 21:23:31.560 webtest[6959:c07] http://www.nytimes.com/2013/03/13/us/politics/ryans-plan-aims-to-balance-budget-in-10-years.html?hp&_r=0
한다 : 당신이 이것을 사용하면 임의의 bit.ly
URL은, 말하자면, http://nyti.ms/Yi6EAk
, 당신은 다음과 같은 로그를 볼 수 있습니다
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"%@", request.URL);
return YES;
}
bit.ly
리디렉션 URL, 즉 두 번의 연속적인 리디렉션의 최종 대상을 정의한 URL입니다. 그러나 shouldStartLoadWithRequest
이 NO
을 반환하면 궁극적으로 리디렉션되는 사이트를 결코 알 수 없습니다. (그건 그렇고, 당신의 shouldStartLoadWithRequest
확실히 샘플 중 하나를 반환하지 않습니다 ... YES
또는 NO
를 반환해야합니다.)
당신이 볼 수 있듯이, shouldStartLoadWithRequest
이 발생하기 때문에 리디렉션이 수행 할 수있는 기회를하기 전에, 당신에게 ' 리다이렉트가 일어날 때마다 볼 수 있습니다. 결과 사이트에 따라 페이지가 추가 콘텐츠를 검색 할 때 이후 shouldStartLoadWithRequest
호출이 표시 될 수 있습니다. 이렇게하면 궁극적으로 리디렉션 된 사이트를 찾는 데 어색한 메커니즘이됩니다.
리디렉션되는 사이트가 실제로 필요한 경우 NSURLConnection
을 대신 사용할 수 있습니다. 일반적으로 서버에서 실제로 데이터를 검색하는 데 사용되지만 리디렉션을 캡처하는 데에도 사용할 수 있지만 (UIWebViewDelegate
메서드 shouldStartLoadWithRequest
의 문제는 발생하지 않습니다.이 경우 임의의 추가 콘텐츠에서 실제 리디렉션을 구별하기가 어렵습니다. 페이지가 계속 요청 될 수 있음).당신이 추적 NSURLConnection
를 사용하고 있기 때문에, 분명히
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
self.url = request.URL;
return request;
}
:
self.url = [NSURL URLWithString:@"http://nyti.ms/Yi6EAk"];
NSURLRequest *request = [NSURLRequest requestWithURL:self.url];
[NSURLConnection connectionWithRequest:request delegate:self];
그런 다음 다양한 리디렉션을 추적합니다 connection:willSendRequest:redirectResponse:
하는 NSURLConnectionDataDelegate
방법을 구현할 수 있습니다
그래서 다음 사항을 고려 리디렉션은 있지만 일반적으로 검색 할 을 사용하는 responseData
에 대해서는별로 신경 쓰지 않아 좋은 응답을 받으면 바로 연결을 취소 할 수 있습니다 (confide NT를 우리가 이미 알고있는 사이트 것은 마지막으로) 리다이렉트하기 :
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[connection cancel];
NSLog(@"Ok, we now know that the resulting URL is %@", self.url);
}
당신은, 그런데, 또한 예를 들어, 연결 오류를 캡처 할 수 있습니다 : 끝으로
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"Ok, we failed trying to retrieve data from %@", self.url);
}
, 그것을 가리키는 가치 이 기술은 HTTP 요청을 NSURLConnection
으로 만들고 전체 일련의 리디렉션을 따르는 것이 매우 비효율적 인 과정이므로 가치가 있는지 여부를 결정해야합니다. 그러나 이것은 HTTP 리디렉션이 당신을 이끌 것 인 곳을 파악하는 한 가지 방법입니다.
마지막으로주의해야 할 점은 전통적인 리디렉션을 캡처하지만 페이지에서 클라이언트 쪽 JavaScript 리디렉션을 수행하는 경우이 기술이 작동한다고 생각하지 않습니다. 하지만 대부분의 리디렉션 된 HTTP 요청에서 작동합니다.
이 방법의 두 번째 줄을 제거하면 첫 번째 줄과 다른 결과가 나타납니다. 이 문제를 보여줄 수있는 코드를 제공 할 수 있습니까? –
예, 코드는 위에 게시해야합니다. 약간의 URL이있는 사이트에 웹보기를 연결하십시오. –
테스트하려면 웹보기로 전체 응용 프로그램을 만들어야합니다. 코드를 최소화하는 것을 포함하여 자신 만의 테스트를 해봐야합니다.이를 해결하려고 노력해야합니다. 그 결과를 공유하십시오. –