避免UIWebView加载iTunes应用程序

Avoid UIWebView load iTunes App

本文关键字:应用程序 iTunes 加载 UIWebView 避免      更新时间:2023-09-26

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

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

上面的URL直接加载iTunes应用程序。UIWebViewDelegate似乎无法控制这一点,只能在UIWebView中加载页面。

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

有什么想法吗?

您说得对,相关函数是detectAndOpenItunes(),它包含在该文件中,要求用户代理字符串中包含"iPhone"或"iPod"。我写了一个快速的小测试应用程序,它有一个web视图,在查看DidLoad时只做以下操作:

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

正如你所说,这将打开应用商店应用程序。所以我把它修改成:

// 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的任何部分,但每当苹果调整页面时,你肯定会遇到问题。

类似地,您可以使用webview的stringByEvaluatingJavaScriptFromString:来执行合适的Javascript,以便在加载后重新格式化页面,但我无法确定您将运行什么,您的解决方案也同样脆弱。