避免UIWebView加载iTunes App

Ben*_*oot 2 javascript iphone objective-c uiwebview uiwebviewdelegate

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

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

以上URL直接加载iTunes App.UIWebViewDelegate似乎无法控制它只是在UIWebView中加载页面.

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

有任何想法吗?

Tom*_*mmy 5

你是对的,相关的函数是detectAndOpenItunes(),它包含在这个文件中,需要'iPhone'或'iPod'在用户代理字符串中.我写了一个带有Web视图的快速小测试应用程序,它只对viewDidLoad执行以下操作:

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

正如您所说,这将打开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"]]];
Run Code Online (Sandbox Code Playgroud)

这会将页面显示为网页而不打开应用程序,但格式化存在问题,显示的页面太宽.快速搜索var deviceDetect=,您将看到用户代理也用于确定格式.

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

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

类似地,您可以使用webview stringByEvaluatingJavaScriptFromString:来执行合适的Javascript以在加载后重新格式化页面,但是我无法准确确定您运行的内容并且您的解决方案将同样脆弱.