2011-09-01 2 views
1

우리는 iOS 용 하이브리드 응용 프로그램을 개발 중입니다. 대부분의 응용 프로그램은 UIWebView 내에서 실행되는 웹 응용 프로그램입니다. 응용 프로그램의 기본 부분에서 URL을 수정하고 일부 매개 변수를 추가해야하는 경우가 있습니다. '대체'솔루션을 사용할 수 있음을 알고 있습니다 (예 : 웹 뷰와 별개로 자체 서버에서 기본 앱 대화). 그러나 나는 주로 URL 확대에 대한 좋은 해결책 인 &에 관심이 있습니다.UIWebView에서 사용되는 URL을 보강하는 가장 안전한 방법은 무엇입니까?

나는 이것을 수행하는 "최상의"기술을 찾고 있었고 (주로) 작동하는 것으로 보이는 두 가지를 발견했다.

기술 # 1 - 재 초기화

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSLog(@"GOTO: %@", [[request URL] absoluteString]); 
    NSURL * oldurl = request.URL; 
    [[request URL] initWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]]; 
    return YES; 
} 

이 기술 # 2가 URL - 새

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSURL * oldurl = request.URL; 
    if ([self isFixed:oldurl]) { 
     return YES; 
    } else { 
     NSURL * newurl = [NSURL URLWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]]; 
     [theWebView loadRequest:[NSURLRequest requestWithURL:newurl]]; 
     return NO; 
    } 
} 

기술 # 2에서 하위 1 URL을 거부 등을 일부 페이지 ("iFrame로드가 중단되었습니다", 다른 문제 일 수도 있음)에서 아티팩트가 발생하는 것으로 보입니다.

다른 사람이 이와 같이 URL 바꾸기를했거나 다른 기술을 사용했거나 다른 사람이 기술 # 1의 문제점을 알고 있다면 궁금합니다 (잘하면 사용하고 있습니다).

나는 방법을 알고있다. swizzling은 권장되지 않으며 Apple의 문서에서는 UIWebView를 서브 클래 싱하지 않기를 권장한다.

감사합니다.

업데이트 우습고 - 기술 # 1은 실제로 작동하지 않습니다. 내 실제 코드는 내가 게시 한 것보다 더 많은 일을하고 있었고, 단지 작동하는 것처럼 보였습니다 ... 이것은 내가 좋아할만한 조금 더 나쁜 것이기 때문에 아마 좋은 소식 일 것입니다.

+0

URL에 매개 변수를 추가하려는 경우이 코드는 좀 더 견고합니다. http://stackoverflow.com/questions/7026916/passing-arguments-into-url-string-objective-c/7027608#7027608 – Jano

+0

아, 그 트릭을 시험해 보겠습니다. 그 게시물에 받아 들여진 해결책이 없다고 조금 걱정했다. – Dave

+0

@Jano, 제안에 감사드립니다. 그러나 다른 대답은 단순히 새로운 URL을 만드는 것입니다.UIWebView에서 사용할 URL을 업데이트하면됩니다. – Dave

답변

1

초기화되지 않은 개체에 대해서는 -init 메서드를 호출하지 마십시오. 이것은 정의 된 동작이 아닙니다. 오래된 요구 ivars가 아마 정확하게 풀어지지 않기 때문에 당신이 여기 메모리를 누설하고있을 가능성이 높습니다.

두 번째 방법과 비슷한 것이 일반적으로 선호됩니다.

또 다른 방법은 NSURLProtocol을 사용하여 URL로드 프로세스에 자신을 포함시키는 것입니다. 그렇게하면 수정 된 NSURLRequest을 사용하여 NSURLConnection을 직접 만들 수 있습니다.

+0

아마도 이것이 가장 "올바른"해결책이라고 생각하기 때문에 더 많은 것을 탐구하고 싶습니다. 불행히도, 약간 총 아래, 그리고 내 자신의 기술 # 2 순간 사용하고 있습니다. 아마도 나는이 접근법을 시도 할 시간을 가지며, 그것에 접근하고 그것에 대해 논평 할 수 있습니다. (현재로서는 이러한 API를 완전히 이해하지 못하므로 추가 포인터를 알려 주시면 감사하겠습니다.) – Dave

+0

NSURLProtocol에 대한 블로그 게시물을 작성해야합니다. 그것은 매우 유용한 것들입니다. 'ProxyURLProtocol'을 보면서 당신이하는 일에 아주 가까운 예를 들어보십시오. 'initWithRequest : ...'에서 설명하는 방법을 설명합니다. 당신이 설명하는 것과 비슷한 요청을 다시 작성합니까? https://github.com/PandoraBoy/PandoraBoy/blob/master/ProxyURLProtocol.m –

+0

감사합니다. 주말 내내 살펴볼 것입니다! – Dave

0

다른 방법으로 시도해 볼 수 있습니다. 나는이 작업을 수행 할 수있는 stringByEvaluatingJavaScriptFromString:와 함께 연주했고, 발견 :

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSString *oldUrlString = [NSString stringWithFormat:"%@", request.URL.absoluteURL]; 

    if ([oldUrlString isEqualToString:@"http://www.google.com/"]) 
    { 
     [webView stringByEvaluatingJavaScriptFromString:@"window.location = \"http://www.arstechnica.com\""]; 

     return NO; 
    } 

    return YES; 
} 

내가 자바 스크립트 주사를 사용하여 리디렉션 관리, www.google.com에 첫 번째 요청은 거부하고, www.arstechnica로 리디렉션됩니다. com (방금 임의의 사이트를 선택했습니다).

URL을 즉시 교체하는 것보다 약간 낫다고 생각합니다.

+0

흥미 롭습니다. 페이지로드에 앵커 중 일부를 다시 작성하기 위해 js 삽입을 사용할 수도 있다고 생각했습니다. 이것은 잘 작동 할 것이고 기술 # 2보다 깨끗할 수도 있습니다. – Dave

관련 문제