如何修复 iOS9 UIWebview 中的 window.location 问题

Posted

技术标签:

【中文标题】如何修复 iOS9 UIWebview 中的 window.location 问题【英文标题】:How to fix window.location issue in iOS9 UIWebview 【发布时间】:2015-12-19 14:15:26 【问题描述】:

ios9 发布以来,我的 Web 应用程序不再运行。 自 iOS9 以来,该应用程序使用基于 url 哈希的导航和路由更改以不可预测的方式触发。

我做了很多研究,发现在IOS9 UIWebview中window.location的管理存在问题。

与这篇文章相关,Angular 社区似乎已经通过发布的 angular.js 补丁解决了这个问题。

https://gist.github.com/IgorMinar/863acd413e3925bf282c

问题已被确定为: iOS9 UIWebview 在使用 window.location 时不会同步更新 href

我查看了他们在 IOS9 中的更正,但我没有找到一种方法来重现他们的更正以使其适用于任何(非角度)webapp。

https://github.com/angular/angular.js/commit/8d39bd8abf423517b5bff70137c2a29e32bff76d#otherHash https://github.com//petebacondarwin/angular.js/commit/47f16f35c213dbb165567102231ac1496246c456 https://github.com//angular/angular.js/blob/master/src/ng/browser.js

是否有人找到或正在研究使角度解决方案在任何(非角度)网络应用程序中工作的解决方案?

更新:

这就是我要调用的那种链接

domain/player/index.html

然后

domain/player/index.html#/online/presentation/ru1XA0nkvgHm/slide/0

[self.view stringByEvaluatingjavascriptFromString:[NSString stringWithFormat:@"window.location.href = '#/offline/presentation/%@/slide/%ld?isNativeApp=1%@%@'",moduleId,(long)slideNumber,infoIcons,testingMode]]);

我做了测试,发现了一些奇怪的东西。

如果我使用最后一个命令进行两次调用,则第二次会触发 hashchange 事件。

我不想将应用重新提交到应用商店,我想修改我的 html(可以从服务器获取)以检测哈希更改并使应用正常工作。

【问题讨论】:

你能给出一个“基于 URL 哈希的导航和路线更改”的代码示例吗? @mark - 我已经用 url 示例更新了描述 我也遇到了同样的问题。我还进行了两次重装以使其正常工作,这太烦人了 【参考方案1】:

问题是这个特定的浏览器在 JavaScript 事件循环的下一次运行之前不会更新 window.location.href 的值。这意味着如果您写入该值然后立即将其读回,您将获得不同的值:

console.log(window.location.href)   // -> http://my.domain.com/path/to/page
window.location.href = 'http://my.domain.com/path/to/other/page';
console.log(window.location.href)   // -> http://my.domain.com/path/to/page

// next tick of the event loop

console.log(window.location.href)   // -> http://my.domain.com/path/to/other/page

请注意,第二个 console.log 返回旧值,而不是新值。当前事件循环完成后,更新值,如第三个console.log所示。

我们想出的解决方法是缓存我们写入的值,如果浏览器没有同步更新,然后从那时起使用该值,而不是从window.location.href返回的值,直到有一个 hashchange 事件,告诉我们浏览器终于​​把自己整理好了。

这里是 AngularJS 中已修复此问题的提交的链接:https://github.com/angular/angular.js/commit/8d39bd8abf423517b5bff70137c2a29e32bff76d

【讨论】:

【参考方案2】:
window.setTimeout(function()
      //the second time you update your url.
      updateUrl();
,0);

这个错误是因为在 IOS 9 中,location.href/location.hash 在你这样改变时不会立即改变: location.href = http://yoururl.com ,它将在下一个事件循环中改变。添加 window.settimeout 将强制代码在下一个事件循环中执行。

【讨论】:

你确定这行得通吗?我看到它偶尔会读取旧的哈希值,即使在下一个事件循环中也是如此。【参考方案3】:

如果您因为使用 onClick 或任何其他处理程序而遇到 href="#" 问题,您可以使用 href="" (不带 # ),它会解决问题

【讨论】:

以上是关于如何修复 iOS9 UIWebview 中的 window.location 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在向下滑动 UIWebView 以修复 iOS7 状态栏覆盖问题后更改 UIWebView 背景颜色?

如何在 iOS9.2 上修复 Xcode 错误“找不到开发者磁盘映像”

我需要使用最新的插件来修复 UIWebview 问题吗?

iOS 10.3 中的 WebView 字体不正确

在 iOS 9 中遇到 WKWebview 和 UIWebView 问题

ios9 Safari 计算错误总和