javascript - 避免 UIWebView 加载 iTunes App

标签 javascript iphone objective-c uiwebview uiwebviewdelegate

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

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

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

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

有什么想法吗?

最佳答案

你说得对,相关函数是 detectorAndOpenItunes(),它包含在 this file 中。并要求用户代理字符串中包含“iPhone”或“iPod”。我编写了一个带有 Web View 的快速小测试应用程序,该应用程序仅在 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 并添加您喜欢的任何协议(protocol)处理程序。如果您设计协议(protocol)来执行 HTTP 请求,那么它将替换处理 HTTP 请求的内置方法。通过选择性地接受或拒绝哪些请求,您可以通过允许您不希望的 HTTP 请求落入真正的协议(protocol)处理程序来进行真正的加载。因此,您可以有选择地捕获并更改任何获取的文件,然后再将其传递到 Web View 。

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

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

关于javascript - 避免 UIWebView 加载 iTunes App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6150088/

相关文章:

javascript - 未设置值时删除输入

javascript - 如何重置 'no' 上的调查问卷

ios - 如何将导航 Controller 添加到不是主视图的 View ?

ios - 让 MobileVLCKit 通过 Cocoapods 工作

javascript - 在对象字面量中声明原型(prototype)

ios - 如何下载旧版本的 iPhone SDK?

iphone - for(NSString *key in [rewards allKeys]) 使应用程序崩溃?

ios - 在 iOS 上启动带有视频的 youtube 应用程序

objective-c - 在 Swift 中将 PDF 图像转换为 NSData for Parse.com

javascript - CSSStyleDeclaration.prototype 上的defineGetter 和defineSetter