2

加载 iTunes URL 时如何避免 UIWebView 打开 iTunes 应用程序?

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

上面的 URL 直接加载 iTunes 应用程序。UIWebViewDelegate 似乎无法控制它以仅在 UIWebView 中加载页面。

它似乎是由 JavaScript 函数 detectAndOpenItunes(); 控制的。在页面的正文标签中。

有任何想法吗?

4

1 回答 1

5

没错,相关函数是 detectAndOpenItunes(),它包含在此文件中,并且需要在用户代理字符串中包含“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=,您会发现用户代理也用于确定格式。

我能想出的唯一解决方案基本上涉及屏幕抓取级别的行为。您可以通过+registerClass:NSURLProtocol子类化并添加您喜欢的任何协议处理程序。如果您将协议设计为执行 HTTP 请求,那么它将替换用于处理 HTTP 请求的内置方法。通过选择性地接受或拒绝哪些请求,您可以通过允许您不想落入真正协议处理程序的 HTTP 请求来进行真正的加载。因此,您可以在允许将其传递到 Web 视图之前选择性地捕获和更改任何获取的文件。

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

同样,您可以使用 webviewstringByEvaluatingJavaScriptFromString:执行合适的 Javascript 以在加载后重新格式化页面,但我无法确定您将运行什么并且您的解决方案同样脆弱。

于 2011-06-06T10:51:21.270 回答