Подтвердить что ты не робот

Как обрабатывать URL-адреса приложений в UIWebView?

Недавно я обнаружил, что мой UIWebView удушал ссылки ITMS. В частности, из UIWebView в моем приложении, если я перейду на сайт, например этот, и нажмите ссылку "Доступно в магазине приложений", UIWebView будет ошибкой с "Error Domain = WebKitErrorDomain Code = 101 Невозможно показать URL."

После небольшого Googling я понял, что мне нужно уловить запросы на ссылки на приложения и обработать их iOS. Я начал с того, что посмотрел, начинается ли схема с "itms" в -webView:shouldStartLoadWithRequest:navigationType:, но поняла, что могут быть другие типы ссылок на приложения, которые система может обрабатывать. Поэтому я придумал это, вместо этого:

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
    // Give iOS a chance to open it.
    NSURL *url = [NSURL URLWithString:[error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]];
    if ([error.domain isEqual:@"WebKitErrorDomain"]
        && error.code == 101
        && [[UIApplication sharedApplication]canOpenURL:url])
    {
        [[UIApplication sharedApplication]openURL:url];
        return;
    }

    // Normal error handling…
}

У меня есть два вопроса:

  • Это здорово? Я специально проверяю код ошибки и код ошибки и извлекаю строку URL из userInfo. Возможно, этот материал останется?
  • Это работает для связанного с ним связанного хранилища приложений, но когда я переключаюсь обратно в свое приложение, похоже, последовал неудачный запрос с неудачей с "Прерывание кадров". как я могу избавиться от этого? Этого не происходит, когда у меня есть ОС, обрабатывающий запрос от -webView:shouldStartLoadWithRequest:navigationType:, так что это немного раздражает.

Как вы обрабатываете такие запросы?

4b9b3361

Ответ 1

Вот что я придумал. В webView:shouldStartLoadWithRequest:navigationType: я прошу ОС обрабатывать любые запросы, отличные от http и non-https, которые он может, например:

- (BOOL)webView:(UIWebView *)wv shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    // Determine if we want the system to handle it.
    NSURL *url = request.URL;
    if (![url.scheme isEqual:@"http"] && ![url.scheme isEqual:@"https"]) {
        if ([[UIApplication sharedApplication]canOpenURL:url]) {
            [[UIApplication sharedApplication]openURL:url];
            return NO;
        }
    }
    return YES;
}

Это работает очень хорошо, за исключением кровавой ошибки "Прерывание кадров". Я думал, что, вернув false из webView:shouldStartLoadWithRequest:navigationType:, что веб-представление не будет загружать запрос, и, следовательно, ошибок не будет. Но даже при том, что я возвращаю NO выше, я по-прежнему "Ошибка загрузки кадра". Почему это?

В любом случае, я предполагаю, что его можно игнорировать в -webView:didFailLoadWithError::

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
    // Ignore NSURLErrorDomain error -999.
    if (error.code == NSURLErrorCancelled) return;

    // Ignore "Fame Load Interrupted" errors. Seen after app store links.
    if (error.code == 102 && [error.domain isEqual:@"WebKitErrorDomain"]) return;

    // Normal error handling…
}

И теперь URL-адреса iTunes работают правильно, как и mailto: и ссылки на приложения.

Ответ 2

Начиная с кода теории, просмотрите URL-адрес схемы (-ов) "itms" (этот метод можно вызвать несколько раз из-за перенаправления). После того, как вы увидите схему "itms", остановите webView от загрузки и откройте URL с Safari. Мой WebView находится в NavigationController, поэтому я выхожу из него после открытия Safari (меньше мигает).

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request 
  navigationType:(UIWebViewNavigationType)navigationType 
{
    if ([[[request URL] scheme] isEqualToString:@"itms-apps"]) {
        [webView stopLoading];
        [[UIApplication sharedApplication] openURL:[request URL]];
        [self.navigationController popViewControllerAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}

Ответ 3

Помогает ли вам зарегистрировать приложение для обработки itms: links?

например. http://inchoo.net/iphone-development/launching-application-via-url-scheme/

Вы можете начать со схемы http, но затем получить перенаправление itms, которое может завершиться неудачно, если ваше приложение не зарегистрировано как обработка этой схемы.