自从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="(不带#(,它将完成