Избегайте загрузки приложения iTunes из UIWebView - PullRequest
2 голосов
/ 27 мая 2011

Как запретить UIWebView открывать приложение iTunes при загрузке URL-адреса iTunes?

Пример URL: http://itunes.apple.com/nl/app/bluppr-postcards/id348147229?mt=8

Выше URL загружает приложение iTunes напрямую. UIWebViewDelegate, похоже, не в состоянии контролировать это, просто загружая страницу в UIWebView.

Похоже, что это контролируется функцией JavaScript deteAndOpenItunes (); в теге body страницы.

Есть идеи?

1 Ответ

5 голосов
/ 06 июня 2011

Вы правы, что релевантной функцией является DeteAndOpenItunes (), которая содержится в этом файле и требует, чтобы в строке агента пользователя было указано «iPhone» или «iPod».Я написал небольшое тестовое приложение с веб-представлением, которое выполняет только следующее при viewDidLoad:

[webView loadRequest:
      [NSURLRequest requestWithURL:
        [NSURL URLWithString:
          @"http://itunes.apple.com/nl/app/bluppr-postcards/id348147229?mt=8"]]];

Как вы говорите, открывается приложение App Store.Поэтому я изменил его на:

// set some user agent that doesn't have 'iPod' or 'iPhone' in the name
[[NSUserDefaults standardUserDefaults] 
             registerDefaults:[NSDictionary 
                        dictionaryWithObject:@"some old phone or other" 
                        forKey:@"UserAgent"]];

[webView loadRequest:
      [NSURLRequest requestWithURL:
        [NSURL URLWithString:
          @"http://itunes.apple.com/nl/app/bluppr-postcards/id348147229?mt=8"]]];

, который отображает страницу как веб-страницу без открытия приложения, но есть проблема с форматированием, поскольку отображаемая страница слишком широка.Выполните быстрый поиск var deviceDetect=, и вы увидите, что пользовательский агент также используется для определения форматирования.

Единственные решения, которые я могу придумать для этого, в основном связаны с поведением на уровне экрана.Вы можете создать подкласс NSURLProtocol и добавить любой понравившийся вам обработчик протокола через + registerClass: .Если вы разрабатываете свой протокол для выполнения HTTP-запросов, он заменит встроенные методы для обработки HTTP-запросов.Выбирая, какие запросы вы принимаете или отклоняете, вы можете выполнять реальную загрузку, позволяя HTTP-запросам, которые вы не хотите, переходить в настоящий обработчик протокола.Следовательно, вы можете выборочно перехватывать и изменять любой извлеченный файл, прежде чем разрешить его передачу в веб-представление.

Вы можете использовать это для отлова и редактирования любых битов .js и .html, которые вам нравятся, но затем выВы, скорее всего, будете сталкиваться с проблемами всякий раз, когда Apple корректирует свою страницу.

Точно так же вы можете использовать stringByEvaluatingJavaScriptFromString: webview для запуска подходящего Javascript для переформатирования страницы после загрузки, но я не могу точно определить, что именно выбудет работать, и ваше решение будет столь же хрупким.

...