【问题标题】:Avoid UIWebView load iTunes App避免 UIWebView 加载 iTunes App
【发布时间】:2011-09-03 06:04:17
【问题描述】:

如何避免 UIWebView 在加载 iTunes URL 时打开 iTunes App?

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

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

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

有什么想法吗?

【问题讨论】:

  • 所以您希望打开 HTML 版本 - 阻止整个 URL 是不可接受的?您是否检查过在所有 http 内容完成后是否为自定义 iTunes URL 方案提供了 webView:shouldStartLoadWithRequest:navigationType: 的 Web 视图委托?
  • 嗨汤米,感谢您的评论。是的,我希望加载 HTML 版本,因此用户将留在应用程序中。 shouldStartLoadWithRequest 在 html 方案之后返回一个 itms-apps 方案。如果我在 itms-apps 方案上的 shouldStartLoadWithRequest 中返回 NO,则它不会加载任何内容并在 didFailLoadWithError 中返回。你有什么建议吗?

标签: javascript iphone objective-c uiwebview uiwebviewdelegate


【解决方案1】:

您说得对,相关函数是detectAndOpenItunes(),它包含在this file 中,并且需要在用户代理字符串中包含“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=,您会看到用户代理也用于确定格式。

我能想到的唯一解决方案基本上涉及屏幕抓取级别的行为。您可以继承 NSURLProtocol 并通过 +registerClass: 添加您喜欢的任何协议处理程序。如果您将协议设计为执行 HTTP 请求,那么它将替换用于处理 HTTP 请求的内置方法。通过选择性地接受或拒绝哪些请求,您可以通过允许您不想落入真正协议处理程序的 HTTP 请求来进行真正的加载。因此,您可以在允许将其传递到 Web 视图之前选择性地捕获和更改任何获取的文件。

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

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

【讨论】:

  • 谢谢!它工作得很好。我不知道我能够更改 UserAgent。我将 UIWebView 与 scalePageToFit 一起使用并禁用了用户交互。用户只需像图像一样查看整个页面。所以这是一个很好的解决方案。
  • 通过用户默认密钥更改用户代理是我从 StackOverflow 中学到的,我自己在交付应用程序时使用过,从未发现过问题,但现在我正在寻找我说实话无法告诉您在官方文档中在哪里可以找到它的权限。因此,实际上可能值得谨慎行事。抱歉我没有提前研究,我现在正在研究它......
  • 抱歉,我确实复制了接受的代码,但我得到了一个 blanc webview?我必须改变那里的任何东西才能让它工作?帮助请..我遇到同样的问题。
  • 这对我不起作用。也许我没有设置合适的用户代理。您能否推荐一个阻止启动 iTunes 应用程序的用户代理?谢谢
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多