2015-09-22 68 views
3

自iOS9發佈以來,我的web應用程序不再工作。 自iOS9以來,應用程序使用基於URL哈希的導航和路由更改以不可預知的方式觸發。如何解決iOS9中的window.location問題UIWebview

我做了大量的研究,發現IOS9 UIWebview中window.location的管理問題。

與此文章相關的角度社區似乎已經解決了angular.js發佈補丁的問題。

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

問題已被確定爲:同步,同時使用了window.location

我通過他們改正IOS9尋找 的iOS9的UIWebView不更新在href但我沒有找到一種方法來重現他們的修正,使其適用於任何(非角度)web應用程序。

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

是否有人發現或正在開發一種解決方案,使任何(非角)的Web應用程序的角度解決方案的工作?

更新:

這是鏈接我打電話

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(可以從服務器獲取)來檢測哈希變化並使應用程序工作。

+0

Cound你給一個代碼示例你的'網址哈希導航和路線變化'? – mark

+0

@mark - 我用網址 – user1751482

+0

更新了描述我也遇到了完全相同的問題。我也做了兩次重新加載,使其工作,這是如此煩人 – oronbz

回答

4

問題是這個特定的瀏覽器不會更新window.location.href的值,直到下一次運行JavaScript事件循環。這意味着,如果你寫的那個值,然後馬上讀出來,你得到一個不同的值:

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

3
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將強制代碼在下一個事件循環中執行。

+1

你確定這個工程?即使在下一個事件循環中,我偶爾也會看到它讀取舊的散列值。 –

1

如果你有HREF =「#」的問題,因爲你正在使用的onClick或任何其他處理程序,你可以HREF使用=「」(不帶#),它會做的伎倆

+0

真棒解決方案,它爲我工作...嘗試了一切沒有工作.... – Sheetal