避免UIWebView加载iTunes App

时间:2011-05-27 09:07:44

标签: javascript iphone objective-c uiwebview uiwebviewdelegate

如何在加载iTunes网址时避免UIWebView打开iTunes App?

示例网址:http://itunes.apple.com/nl/app/bluppr-postcards/id348147229?mt=8

以上网址直接加载iTunes应用程序。 UIWebViewDelegate似乎无法控制它只是在UIWebView中加载页面。

它似乎受JavaScript函数detectAndOpenItunes()的控制;在页面的body标签中。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

你是对的,相关的函数是detectAndOpenItunes(),它包含在this file中,需要'iPhone'或'iPod'在用户代理字符串中。我写了一个带有Web视图的快速小测试应用程序,它只在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请求来进行实际加载。因此,您可以选择捕获并更改任何已获取的文件,然后再将其传递到Web视图。

您可以使用它来捕获和编辑您喜欢的任何.js和.html,但是当Apple调整页面时,您几乎会遇到问题。

同样,您可以使用webview的stringByEvaluatingJavaScriptFromString:执行合适的Javascript以在加载后重新格式化页面,但我无法准确确定您的运行情况,并且您的解决方案也会非常脆弱。

相关问题