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标签中.
有任何想法吗?
你是对的,相关的函数是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以在加载后重新格式化页面,但是我无法准确确定您运行的内容并且您的解决方案将同样脆弱.
| 归档时间: |
|
| 查看次数: |
1938 次 |
| 最近记录: |