2009-10-12 1 views
3

나는 프로그래밍 방식으로 UIWebView을 작성했으며, 내 서버에 저장된 iPhone 스타일의 사이트를 탐색하는 데 사용됩니다. 이 웹 사이트에는 사용자가 내 응용 프로그램에 다운로드 할 수있는 파일에 대한 몇 가지 링크가 있습니다. 이 메서드를 호출 할 때UIWebView에서 다운로드 감지

- (BOOL) webView:(UIWebView *) webView shouldStartLoadWithRequest:(NSURLRequest *) request navigationType:(UIWebViewNavigationType) navigationType 
{ 
    url = [request URL]; 
    NSString *mimeType = [request valueForHTTPHeaderField:@"Content-Type"]; 
    NSLog(@"Content-type: %@", mimeType); 
    if(mimeType == @"application/zip" || mimeType == @"application/x-zip" || mimeType == @"application/octet-stream") 
    { 
     NSLog(@"Downloading file!"); 
     [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"/tmp/file.ipa"]; 
     return NO; 
    } 
    return YES; 
} 

그러나, 콘텐츠 형식 헤더는 거의 항상 (널), 그래서 파일을 다운로드 할 수 있어요 결코 : 지금, 나는 이것을 감지하기 위해 노력하고있어.

어떻게하면 제대로 할 수 있습니까?

답변

3

아직 작성되지 않은 NSURLRequest에서 Content-Type을 감지하려고합니다. NSURLConnection을 사용하여 요청을 한 후에야 Content-Type을 알 수 있습니다. 이 경우 URL 경로의 파일 확장자를 살펴볼 것입니다.

+1

문제는 URL은 파일 이름이없는 시스템에 저장됩니다. http://example.com/some/stuff/32f3121a234ae32423 –

+0

"HEAD"의 httpMethod를 사용하면 다음과 같이 나타납니다. 헤더. 그러나 초기 탭 이후에 콘텐츠 호출이 필요합니다. –

0

여기에 문제가 있습니다. UIWebView은 표시 할 수없는 내용을 다운로드하지 않으며 ZIP 파일을 표시하는 방법을 알지 못합니다. Content-Type이 채워지기 전에는 항상 실패합니다.

그럼, 어떻게해야합니까? 서버 측 응용 프로그램이 iPhone 이상으로 실행되는지는 모르지만 myapplication://example.com/stuff/yourhexurlgoeshere과 같은 링크가있는 사용자 정의 URL 스키마를 등록 할 수 있습니다. myapplication 체계에 대한 사용자 지정 URL 처리기를 만들 수 있습니다. 검색하는 데 몇 초가 걸려서 수행하는 방법을 설명하는 this site을 생성했습니다.

이렇게하면 다른 사용자에게 그러한 링크를 이메일로 보내면 Mail에서 해당 링크를 이메일로 보내고 응용 프로그램에서 열 수 있기 때문에 이점이 있습니다. 오디오/MP3를위한

+0

NSURLConnection과 같은 것을 통해 반환 된 헤더를 가져 오는 메서드가 있습니까?그런 다음 수동으로 zip 파일을 직접 스캔 할 수는 있지만 헤더를 확인하기 위해 전체 페이지를 두 번 다운로드 할 필요가 없다면 더 좋을 것입니다. –

+0

사실,'webView : shouldStartLoadWithRequest :'는 값을 반환 할 것을 기대하고 있습니다. 헤더를 얻기 위해 동기식 NSURLRequest를 수행하기 위해 잠시 동안 전체 애플리케이션을 정지시켜야 할 것이다. 놀랍게도 힘든 문제입니다. – Alex

+0

그러나 비동기식 프로그램을 실행 한 후 어떤 프로그램을 실행했는지에 상관없이 YES를 반환 한 다음 몇 초 만에 다운로드를 시작하도록 할 수 있습니다. 하지만 어떻게 헤더를 얻을 수 있습니까? –

0

---------- 스위프트 4+ -------

예를 감지 -

1 단계 : 사용 위임

class ViewController : WKUIDelegate,WKNavigationDelegate { 

2 단계 : 설정 웹킷

func setWebView() { 
     let webConfiguration = WKWebViewConfiguration() 
     webView = WKWebView(frame: .zero, configuration: webConfiguration) 
     webView.uiDelegate = self 
     webView.navigationDelegate = self 
     view = webView 

     let myURL = URL(string: "https://www.bossmobi.guru/files/download/type/320/id/197255")//your audio url 
     let myRequest = URLRequest(url: myURL!) 
     webView.load(myRequest) 
    } 

3 단계 : 웹킷 위임에서 오디오 MIME 유형을 가져옵니다.

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { 
     print(#function + "url is \(String(describing: webView.url))" + "Mimetype" + "\(navigationResponse.response.mimeType ?? "NotAvailable")") 
     if let _ = navigationResponse.response.mimeType?.range(of: "audio/mpeg") { 
      print("MP3 is audio url \(String(describing: webView.url))") 
      webView.stopLoading() 
     } 
     decisionHandler(.allow) 
    } 

--------- ObjC ----------

WKWebView 설치

NSString *urlString = @"https://www.bossmobi.guru/files/download/type/320/id/197255"; 

    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; 
    WKWebView *_demoWKWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration]; 
    _demoWKWebView.navigationDelegate = self; 
    _demoWKWebView.UIDelegate = self; 
    NSURL *nsurl=[NSURL URLWithString:urlString]; 
    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl]; 
    [_demoWKWebView loadRequest:nsrequest]; 
    [self.view addSubview:_demoWKWebView]; 

WKWebView 대리자

-(void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { 
    //NSLog(@"decidePolicyForNavigation---Response %@",webView.URL); 
    if ([navigationResponse.response.MIMEType isEqualToString:@"audio/mpeg"]) { 
     NSLog(@"MP3 audio url is %@",webView.URL); 
    } 
    decisionHandler(WKNavigationResponsePolicyAllow); 
}