加载 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/