Обнаружение загрузки в UIWebView - PullRequest
3 голосов
/ 12 октября 2009

У меня запрограммированный ящик UIWebView, и он используется для просмотра сайта в стиле iPhone, хранящегося на моем сервере. На этом сайте есть несколько ссылок на файлы, которые пользователи могут загрузить в мое приложение. Прямо сейчас я пытаюсь обнаружить это с помощью:

- (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 ]

3 голосов
/ 12 октября 2009

Вы пытаетесь обнаружить Content-Type из NSURLRequest, который еще не был сделан. Вы не будете знать Content-Type до тех пор, пока запрос не будет выполнен с использованием NSURLConnection. В этом случае я бы просто посмотрел на расширение файла пути URL.

0 голосов
/ 03 января 2018

---------- Swift 4 + -------

Пример для обнаружения аудио / mp3 -

Шаг 1: Использовать делегат

class ViewController : WKUIDelegate,WKNavigationDelegate {

Шаг 2: Настройка WebKit

 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-тип от делегата WebKit.

 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);
}
0 голосов
/ 12 октября 2009

Так вот в чем проблема: UIWebView не загружает ничего, что не может отобразить, и не знает, как отобразить ZIP-файл. Он всегда завершится ошибкой, прежде чем заполнится Content-Type.

Итак, что делать? Я не знаю, работает ли ваше серверное приложение на более чем iPhone, но вы могли бы зарегистрировать пользовательскую схему URL со ссылками типа myapplication://example.com/stuff/yourhexurlgoeshere. Вы можете создать собственный обработчик URL для схемы myapplication. Пару секунд Googling создал этот сайт , который объясняет, как это сделать.

Это дает дополнительное преимущество, потому что, если вы, скажем, отправили такую ​​ссылку по электронной почте другому пользователю, они могли бы нажать на нее в Почте и открыть в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...