Как обрабатывать 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:
, так что это немного раздражает.
Как вы обрабатываете такие запросы?
Ответы
Ответ 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
, которое может завершиться неудачно, если ваше приложение не зарегистрировано как обработка этой схемы.