没错,相关函数是 detectAndOpenItunes(),它包含在此文件中,并且需要在用户代理字符串中包含“iPhone”或“iPod”。我编写了一个带有 web 视图的快速小测试应用程序,它在 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
子类化并添加您喜欢的任何协议处理程序。如果您将协议设计为执行 HTTP 请求,那么它将替换用于处理 HTTP 请求的内置方法。通过选择性地接受或拒绝哪些请求,您可以通过允许您不想落入真正协议处理程序的 HTTP 请求来进行真正的加载。因此,您可以在允许将其传递到 Web 视图之前选择性地捕获和更改任何获取的文件。
您可以使用它来捕获和编辑您喜欢的任何 .js 和 .html 位,但是每当 Apple 调整他们的页面时,您几乎肯定会遇到问题。
同样,您可以使用 webviewstringByEvaluatingJavaScriptFromString:
执行合适的 Javascript 以在加载后重新格式化页面,但我无法确定您将运行什么并且您的解决方案同样脆弱。