如何修复 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 错误“找不到开发者磁盘映像”