Comment réparer la fenêtre.emplacement problème dans iOS9 UIWebview
Depuis iOS9 libération, mes web app ne fonctionne plus.
L'application utilise une url de hachage basée sur la navigation et les modifications d'itinéraire, déclencher une manière imprévisible depuis iOS9.
J'ai fait beaucoup de recherche et de trouver la cause dans la gestion de la fenêtre.emplacement dans IOS9 UIWebview.
Relatives à ce poste, l'angulaire de la communauté semble avoir résolu le problème avec un libéré patch pour angular.js.
https://gist.github.com/IgorMinar/863acd413e3925bf282c
Le problème a été identifié comme :
Le iOS9 UIWebview ne met pas à jour le href de façon synchrone lors de l'utilisation de la fenêtre.emplacement
J'ai regardé à travers leurs corrections dans IOS9 mais je ne trouve pas un moyen de reproduire leur correction à faire, il travaille avec quel (non angulaire) 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
N'quelqu'un l'a trouvé ou est de travailler sur une solution pour rendre la solution angulaire de travail en tout (non angulaire) web app?
Mise à jour:
C'est le genre de lien que je vais appeler
domain/player/index.html
puis
domain/player/index.html#/online/presentation/ru1XA0nkvgHm/slide/0
avec
[self.view stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.location.href = '#/offline/presentation/%@/slide/%ld?isNativeApp=1%@%@'",moduleId,(long)slideNumber,infoIcons,testingMode]]);
J'ai fait des tests et trouver quelque chose d'étrange.
Si je fais un double appel avec la dernière commande, la deuxième fois, le hashchange les déclencheurs d'événement.
Je ne veux pas avoir à soumettre de nouveau à l'application de l'app store, je veux modifier mon code html (qui peut être récupéré depuis le serveur) pour détecter le changement de hachage et de faire ce que l'application fonctionne.
- Pouvait vous donner un exemple de code de votre "url de hachage basée sur la navigation et les changements de route'?
- J'ai mis à jour la description d'un exemple de l'url
- Je suis également rencontrer exactement le même problème. J'ai également fait de la double recharge pour le faire fonctionner, c'est tellement ennuyeux
Vous devez vous connecter pour publier un commentaire.
Le problème est que ce navigateur ne prend pas de mise à jour de la valeur pour
window.location.href
jusqu'à la prochaine exécution du JavaScript boucle d'événements. Cela signifie que si vous écrivez à cette valeur, puis immédiatement à le lire, vous obtenez une valeur différente:Avis que la deuxième
console.log
retourne l'ancienne valeur, pas la nouvelle valeur. Après l'événement en cours boucle est terminée, la valeur est mise à jour, comme peut être vu dans la troisièmeconsole.log
.Le correctif que nous avons monté avec, est de mettre en cache la valeur que nous avons écrit, si le navigateur n'est pas à jour de manière synchrone, et ensuite utiliser cette valeur à partir de là, au lieu de la valeur de retour de
window.location.href
, jusqu'à ce qu'il y a un hashchange événement, qui nous dit que le navigateur a enfin réglé.Voici un lien vers l'engagement dans AngularJS, lorsque cela est fixe: https://github.com/angular/angular.js/commit/8d39bd8abf423517b5bff70137c2a29e32bff76d
Le bug est parce que de dans IOS 9 ,l'emplacement.href/emplacement.de hachage ne changerait pas immédiatement lorsque vous changer cela comme ceci: emplacement.href = http://yoururl.com , il sera modifié dans la prochaine Boucle d'Événements. Ajout de la fenêtre.settimeout va forcer le code à exécuter lors de la prochaine épreuve de la Boucle.
Si vous avez des problèmes avec href="#" parce que vous êtes à l'aide de onClick ou tout autre gestionnaire que vous pourriez utiliser href="" (sans le # ) et il fera le tour