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



自从iOS9发布以来,我的web应用程序不再工作。自iOS9以来,该应用程序以不可预测的方式使用基于url哈希的导航和路线更改触发器。

我做了大量的研究,发现IOS9 UIWebview中window.location的管理问题。

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

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

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

我在IOS9中查看了他们的更正,但我没有找到一种方法来复制他们的更正以使其适用于任何(非角度(网络应用程序。

https://github.com/angular/angular.js/commit/8d39bd8abf423517b5bff70137c2a29e32bff76d#otherHashhttps://github.com//petebacondarwin/angular.js/commit/47f16f35c213dbb165567102231ac1496246c456https://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(可以从服务器上获取(,以检测哈希变化并使应用程序工作。

问题是,在下一次运行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

window.setTimeout(function(){
      //the second time you update your url.
      updateUrl();
},0);

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

如果由于使用onClick或任何其他处理程序而导致href="#"出现问题,则可以使用href="(不带#(,它将完成

相关内容

  • 没有找到相关文章

最新更新