Le code HTML simple suivant illustre le problème :
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular-route.js"></script>
<script>
angular.module('fail', ['ngRoute'])
.config(function($routeProvider) {
$routeProvider
.when('/a', {
template: '<a ng-href="#/b">a</a>'
})
.when('/b', {
template: '<a ng-href="#/a">b</a>'
})
.otherwise({
redirectTo: '/a'
});
});
</script>
</head>
<body ng-app="fail">
<div ng-view></div>
</body>
</html>
Cela fonctionne comme prévu sur la plupart des appareils, mais il lève une exception de résumé infinie sur iOS 9.
Je suis capable de reproduire sur iPad Air 2 et iPad 4ème génération avec iOS 9 beta 2.
Je me rends compte que c'est probablement un problème dans iOS, mais cela vaut peut-être encore la peine d'être étudié.
J'ai rencontré un problème similaire, qui s'est produit sur ios 9, mais fonctionne correctement sur d'autres appareils.
J'ai reproduit ce problème avec le même code fourni par santaslow sur 1.4.1 / ios 9 :
<!DOCTYPE html>
<html>
<head>
<script src="../static/js/angular/angular.1.4.1.js"></script>
<script src="../static/js/angular-route/angular-route.1.4.1.js"></script>
<script>
angular.module('fail', ['ngRoute'])
.config(function ($routeProvider) {
$routeProvider
.when('/a', {
template: '<a ng-href="#/b">a</a>'
})
.when('/b', {
template: '<a ng-href="#/a">b</a>'
})
.otherwise({
redirectTo: '/a'
});
}).factory('$exceptionHandler', ['$log', function($log) {
return function(exception, cause) {
var message = 'angularjs exception: '+exception.message+': caused by "' + cause+ '\njs stack:\n'+exception.stack;
$log.error(message);
};
}]);
</script>
</head>
<body ng-app="fail">
<div ng-view></div>
</body>
</html>
Le code ci-dessus s'exécute normalement sur le navigateur de bureau, Android et ios 8 webview, mais sur ios 9, il lèvera une exception lorsque je cliquerai sur le lien :
2015-07-02 11:00:09 ... angularjs exception: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.4.1/$rootScope/infdig?p0=10&p1=%5B%5D: caused by "undefined
js stack:
file:///.../static/js/angular/angular.js:68:32
$digest<strong i="10">@file</strong>:///.../static/js/angular/angular.js:15705:35
$apply<strong i="11">@file</strong>:///.../static/js/angular/angular.js:15935:31
file:///.../static/js/angular/angular.js:12070:30
eventHandler<strong i="12">@file</strong>:///.../static/js/angular/angular.js:3264:25
Je ne peux plus reproduire dans iOS 9 Beta 3.
Je reçois la même erreur avec la bêta publique ios9 (13A4293g)
J'ai vérifié le code ci-dessus sur ios 9 beta 3 (13A4293g), plus aucune exception. Mais l'application utilisant ng-view lance toujours des exceptions infdig sur ios 9 beta 3.
Je reçois la même erreur avec la bêta publique ios9 (13A4293g)
Erreur : [$ rootScope:infdig ] 10 itérations $digest() ont été atteintes. Abandonner !
Observateurs tirés au cours des 5 dernières itérations : []
http://errors.angularjs.org/1.3.13/ $rootScope/infdig?p0=10&p1=%5B%5D
file:///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-807B-EA17B2479E58/BAShops.app/www /lib/ionic/js/ionic.bundle.js:8762:32
$digest@file :///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-807B-EA17B2479E58/BA app/www/lib/ionic/js/ionic.bundle.js:22980:35
$apply@file :///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-807B-EA17B2479E58/BA app/www/lib/ionic/js/ionic.bundle.js:23205:31
file:///Users/mac5/Library/Developer/CoreSimulator/Devices/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/data/Containers/Bundle/Application/9B5EE368-F2A0-4C99-807B-EA17B2479E58/BAShops.app/www /lib/ionic/js/ionic.bundle.js:54879:24
eventHandler@file :///
dispatchEvent@[code natif]
triggerMouseEvent@file :///
tapClick@file :///
tapTouchEnd@file :///
Nous recevons également cette erreur sur la bêta publique 3 d'iOS 9 avec notre propre application Angular. Cela ne se produit pas dans iOS 8.
Pour contourner le problème, j'ai écrit une directive simple pour remplacer ng-view et angular-route.js. La solution a bien fonctionné dans notre propre application, toutes les exceptions infdig ont disparu sur ios 9 beta/beta 3. Ci-dessous se trouve le code simplifié, qui est juste pour notre propre application, les cas d'utilisation générale ne sont pas pris en compte. Je ne recommande pas à d'autres personnes d'utiliser ceci :
(function (window) {
'use strict';
var myApp = angular.module("myApp");
var $route = {};
// replace $routeProvider.when with the function below:
window.routeWhen = function(path, route) {
$route[path] = route;
};
myApp.directive("myView", ['$compile', '$controller', '$http', '$rootScope', function ($compile, $controller, $http, $rootScope) {
return {
priority: -400,
link: function (scope, element) {
var parentScope = scope;
scope = null;
window.updateView = function (path) {
location.hash = '#'+url;
if (scope) scope.$destroy();
scope = parentScope.$new();
var route = $route[path];
var linkView = function(html) {
element.html(html);
var link = $compile(element.contents());
var controller = $controller(route.controller, {$scope: scope});
element.data('$ngControllerController', controller);
element.children().data('$ngControllerController', controller);
link(scope);
scope.$emit('$viewContentLoaded');
if (!$rootScope.$$phase && !scope.$$phase) scope.$apply();
};
if (route.templateCache) linkView(route.templateCache)
else if (route.template) {
route.templateCache = document.getElementById(route.template).innerHTML;
linkView(route.templateCache)
}
else $http.get(route.templateUrl;).success(function(html) {
route.templateCache = html;
linkView(html);
});
};
//updateView(initialPath);
// call updateView(path) to set location at other places of the app
}
};
}]);
})(window)
Je viens d'installer iOS 9 Beta 4 et j'ai toujours le même problème. Quelqu'un d'autre?
Je l'ai vu dans iOS 9 Beta 3 et je le vois toujours dans iOS 9 Beta 4.
+1
Oui, nous constatons également le même problème, même avec un routeur ui angulaire. Est-ce que quelqu'un a une solution valable autour de ce problème en attendant?
Voir le même problème dans uiWebView sur le dernier iOS9.
Quelqu'un a-t-il des mises à jour sur ce problème?
C'est toujours un problème. Réouverture
Cela ressemble à un problème ios. Est-ce que c'est suivi sur webkit quelque part ?
+1
+1
Pareil ici. Notre application Cordova fonctionne bien si elle s'exécute en tant que Web sur l'iPad Safari, mais le résumé infini se produit si elle s'exécute en tant qu'application Cordova (UIWebView).
Exactement les mêmes problèmes que @borrull ! Déjà expérimenté avec WKWebView et le problème n'existe pas. Mais nous ne pouvons pas utiliser WKWebView car nous avons besoin d'un service de fichiers local (et nous ne voulons pas exécuter un serveur local dans notre application) et de cookies. Il doit donc faire quelque chose avec UIWebView en combinaison avec Cordova/Mobile Safari sur iOS 9. Je débogue actuellement $locationWatch dans Angular car je vois que notre application veut passer plusieurs fois à un autre emplacement puis (après 10 fois ) l'erreur de résumé est levée.
même problème ici sur iOS9 béta4
Boucle $digest infinie angulaire ;(
+1, uniquement dans UIWebView, pas dans WKWebView mais nous ne pouvons utiliser UIWebView que dans notre application cordova.
+1
S'il s'agit d'un problème spécifique à iOS, veuillez ouvrir un problème sur l'outil de suivi des problèmes du kit Web et fournir une démo ! +1 ici ne changera probablement rien, car cela ressemble vraiment à un bogue de navigateur.
Quelqu'un a-t-il signalé ce bogue à Apple pour enquête ?
J'ai signalé ce bug à Apple. Mais peut-être devriez-vous tous faire de même pour attirer leur attention sur le bogue.
Pouvez-vous nous donner un lien pour que nous puissions +1 ?
C'est dans notre compte Apple personnel via le bug reporter .. donc pas de lien public ;(
Pourriez-vous le publier sur openradar et partager l'identifiant rdar afin que nous puissions le duper !
idem sur iOS9 béta 5 :
fonctionne sur safari mobile
fonctionne sur WKWebview que nous ne pouvons pas utiliser car il ne peut pas servir les fichiers locaux et ne prend pas en charge NSProtocol
fonctionne PAS sur UIWebView
idem ici sur IOS 9 Beta 5
J'ai également signalé un bug à Apple. Le lien Open Radar est : https://openradar.appspot.com/22186109 (Cela devrait aider les paresseux à signaler un bogue). Veuillez laisser des commentaires si vous pouvez améliorer la formulation/l'explication du bogue ;-) Vous pouvez télécharger le projet Xcode à joindre avec le dossier de bogue sur le ticket Open Radar (Merci à @santaslow pour le JS dans l'OP)
J'ai créé une version du même projet Xcode (de @borrull) mais avec ui-router au lieu de ng-route. Exactement le même problème. Pour les personnes intéressées, vous pouvez retrouver le projet ici : http://s000.tinyupload.com/index.php?file_id=87281871603760127355
Nous voyons également ce problème. J'ai pu résoudre le problème en ce sens que les propriétés location.* ne sont pas mises à jour immédiatement lorsque angulaire est dans le mélange. Si vous essayez d'attribuer une valeur à location.hash (comme ce qui est fait derrière le service de localisation), puis relisez-la immédiatement, la valeur n'a pas changé. Il semble y avoir des effets secondaires résultant des gestionnaires jqlite attachés aux événements popstate et hashchanged.
J'essaierai de télécharger un échantillon lorsque je serai sur un ordinateur.
+1
@CleverCoder Des mises à jour sur l'échantillon ?
Je devrai finir le cas de repro dans la matinée, car le code car j'ai été ligoté tout le week-end. Merci pour le coup de pouce ! Alors que iOS 9 compte à rebours, nous avons tout intérêt à ce que cela soit résolu. Je téléchargerai quelque chose dès que possible.
+1
J'ai reproduit ce que je pense être la cause première, où la définition des propriétés de hachage ou href d'emplacement ne "s'applique" pas immédiatement.
Voici un lien vers le projet XCode :
https://www.dropbox.com/s/2jkwv2thhm86nly/iOS%209%20Location%20Bug.zip?dl=0
Faites-moi savoir si vous ne pouvez pas accéder au fichier.
Observez la valeur résultante dans location.hash et attachez Safari au débogage. Il semble y avoir quelque chose qui retarde le changement à la suite d'une certaine plomberie d'événements basée sur les événements « popstate » et « hashchange ».
J'espère que ceci est utile.
Nous utilisons window.location.href au lieu d'utiliser state.go et cela semble fonctionner pour le moment. Moins de buggy.
La valeur de location.hash sera correcte après un tour de la boucle d'exécution. Angular peut facilement contourner ce problème en retardant l'obtention de location.hash dans un setTimeout(..., 0). Je pense que ce serait ~ 2 changements à angular.js/src/ng/location.js.
@hober Essayé le délai d'attente avec angulaire comme ceci:
// update $location when $browser url changes
$browser.onUrlChange(function(newUrl, newState) {
$rootScope.$evalAsync(function() {
var oldUrl = $location.absUrl();
var oldState = $location.$$state;
var defaultPrevented;
$location.$$parse(newUrl);
$location.$$state = newState;
defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
newState, oldState).defaultPrevented;
// if the location was changed by a `$locationChangeStart` handler then stop
// processing this location change
if ($location.absUrl() !== newUrl) return;
if (defaultPrevented) {
$location.$$parse(oldUrl);
$location.$$state = oldState;
setTimeout(function(){ setBrowserUrlWithFallback(oldUrl, false, oldState) }, 0);
} else {
initializing = false;
afterLocationChange(oldUrl, oldState);
}
});
if (!$rootScope.$$phase) $rootScope.$digest();
});
et
// update browser
$rootScope.$watch(function $locationWatch() {
var oldUrl = trimEmptyHash($browser.url());
var newUrl = trimEmptyHash($location.absUrl());
var oldState = $browser.state();
var currentReplace = $location.$$replace;
var urlOrStateChanged = oldUrl !== newUrl ||
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
if (initializing || urlOrStateChanged) {
initializing = false;
$rootScope.$evalAsync(function() {
var newUrl = $location.absUrl();
var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
$location.$$state, oldState).defaultPrevented;
// if the location was changed by a `$locationChangeStart` handler then stop
// processing this location change
if ($location.absUrl() !== newUrl) return;
if (defaultPrevented) {
$location.$$parse(oldUrl);
$location.$$state = oldState;
} else {
if (urlOrStateChanged) {
setTimeout(function(){ setBrowserUrlWithFallback(newUrl, currentReplace,
oldState === $location.$$state ? null : $location.$$state) }, 0);
}
afterLocationChange(oldUrl, oldState);
}
});
}
$location.$$replace = false;
// we don't need to return anything because $evalAsync will make the digest loop dirty when
// there is a change
});
J'ai donc ajouté un setTimout autour de la méthode setBrowserUrlWithFallback mais cela ne résout pas le problème.
Voici un cas de test réduit qui ne repose pas sur Angular et qui illustre la solution de contournement. Comment implémenter réellement la solution de contournement dans Angular n'est pas clair pour moi. https://gist.github.com/hober/a29b6c28ac1744c800dd
Je suis allé un peu plus loin sur celui-ci. J'ai fait un changement dans Angular concernant l'emplacement.
Dans la partie "navigateur de mise à jour", j'ai changé le $rootScope.$evalAsync en $rootScope.$applyAsync.
Les deux méthodes semblent faire exactement la même chose. La différence ne devient évidente que lorsque vous regardez l'exécution réelle de $digest. Lorsque AngularJS exécute un condensé, il parcourt l'arborescence Scope et exécute les liaisons $watch() jusqu'à ce qu'aucune donnée sale ne soit produite. Au cours de ce cycle de vie, la file d'attente $applyAsync() et la file d'attente $evalAsync() sont vidées ; mais, cela se produit dans deux endroits très différents.
La file d'attente $applyAsync() n'est vidée qu'en haut de $digest avant qu'AngularJS ne commence à rechercher les données modifiées. En tant que telle, la file d'attente $applyAsync() sera vidée, au plus, une fois au cours d'un $digest et ne sera vidée que si la file d'attente était déjà remplie avant le début de $digest.
La file d'attente $evalAsync(), d'autre part, est vidée en haut de la boucle while qui implémente le "dirty check" à l'intérieur du $digest. Cela signifie que toute expression ajoutée à la file d'attente $evalAsync() lors d'un condensé sera exécutée ultérieurement dans le même condensé.
Pour rendre cette différence plus concrète, cela signifie que les expressions asynchrones ajoutées par $evalAsync() à partir d'une liaison $watch() s'exécuteront dans le même condensé. Les expressions asynchrones ajoutées par $applyAsync() à partir d'une liaison $watch() s'exécuteront à un moment ultérieur (~10ms).
J'espère que cela aidera déjà certains d'entre vous :-).
// update browser
$rootScope.$watch(function $locationWatch() {
var oldUrl = trimEmptyHash($browser.url());
var newUrl = trimEmptyHash($location.absUrl());
var oldState = $browser.state();
var currentReplace = $location.$$replace;
var urlOrStateChanged = oldUrl !== newUrl ||
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
if (initializing || urlOrStateChanged) {
initializing = false;
$rootScope.$applyAsync(function() {
var newUrl = $location.absUrl();
var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
$location.$$state, oldState).defaultPrevented;
// if the location was changed by a `$locationChangeStart` handler then stop
// processing this location change
if ($location.absUrl() !== newUrl) return;
if (defaultPrevented) {
$location.$$parse(oldUrl);
$location.$$state = oldState;
} else {
if (urlOrStateChanged) {
setBrowserUrlWithFallback(newUrl, currentReplace,
oldState === $location.$$state ? null : $location.$$state);
}
afterLocationChange(oldUrl, oldState);
}
});
}
$location.$$replace = false;
// we don't need to return anything because $evalAsync will make the digest loop dirty when
// there is a change
});
Voici une autre approche. Je ne connais pas très bien la base de code Angular, mais la logique semble rationnelle. La fonction url(...) du navigateur dépend actuellement de location.href renvoyant immédiatement l'URL correcte. Étant donné que cette méthode est appelée dans la même boucle d'exécution, dans le cycle de stabilisation $digest, elle continue d'obtenir l'ancienne URL. Ce correctif exploite un 'pendingHref' pour suivre l'affectation, renvoyant cette valeur à la place, si elle est définie. Une fois la valeur alignée avec location.href, la valeur en attente est effacée. Pendant un ensemble de l'url, une minuterie est définie avec 0ms pour attraper le cas où une url() get n'est pas appelée. Ce n'est pas parfait, mais la logique semble fonctionner. Il s'agit principalement d'envisager une approche alternative qui ne crée pas de retards de performance. Ceci est basé sur la balise Angular v1.4.3.
diff --git a/src/ng/browser.js b/src/ng/browser.js
index 928de95..3b9957e 100644
--- a/src/ng/browser.js
+++ b/src/ng/browser.js
@@ -87,7 +87,9 @@ function Browser(window, document, $log, $sniffer) {
var cachedState, lastHistoryState,
lastBrowserUrl = location.href,
baseElement = document.find('base'),
- reloadLocation = null;
+ reloadLocation = null,
+ pendingHref = null,
+ pendingHrefTimer = null;
cacheState();
lastHistoryState = cachedState;
@@ -124,6 +126,18 @@ function Browser(window, document, $log, $sniffer) {
if (location !== window.location) location = window.location;
if (history !== window.history) history = window.history;
+ // Schedule cleaning up pendingHref on the next run loop for setting URL. This is to handle
+ // the case where the browser doesn't update the location.* properties immediately
+ if (!pendingHrefTimer && pendingHref && url) {
+ pendingHrefTimer = setTimeout(function () {
+ if (location.href == pendingHref) {
+ console.log('Actual href updated... setting pendingHref to null from setTimeout');
+ pendingHref = null;
+ }
+ pendingHrefTimer = null;
+ }, 0);
+ }
+
// setter
if (url) {
var sameState = lastHistoryState === state;
@@ -147,6 +161,7 @@ function Browser(window, document, $log, $sniffer) {
// Do the assignment again so that those two variables are referentially identical.
lastHistoryState = cachedState;
} else {
+ pendingHref = url;
if (!sameBase || reloadLocation) {
reloadLocation = url;
}
@@ -161,10 +176,22 @@ function Browser(window, document, $log, $sniffer) {
return self;
// getter
} else {
+ var href = location.href.replace(/%27/g, "'");
+ if (pendingHref) {
+ //console.log('.. using pendingHref for url() return value');
+ href = pendingHref;
+ }
+
+ if (location.href == pendingHref) {
+ console.log('Actual href updated... setting pendingHref to null in getter');
+ pendingHref = null;
+ }
+
+ //var href = location.href.replace(/%27/g,"'");
// - reloadLocation is needed as browsers don't allow to read out
// the new location.href if a reload happened.
// - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
- return reloadLocation || location.href.replace(/%27/g,"'");
+ return reloadLocation || href;
}
};
Merci @CleverCoder pour la solution ! Semble fonctionner comme un charme! :+1:
@CleverCoder
Ce serait formidable si vous faisiez une demande de tirage avec cela à l'équipe angulaire.
@viattik Je serais en quelque sorte surpris si l'équipe angulaire adoptait une solution de contournement pour UIWebView sur iOS9, car le bogue se trouve dans UIWebView (Apple) lui-même. Mais tu peux toujours essayer...
@raftheunis87
Il existe de nombreux bogues dans différents navigateurs et de nombreuses solutions de contournement pour ces bogues dans le code angulaire.
Bien qu'elles ne prennent pas officiellement en charge UIWebView, de nombreuses applications hybrides seront cassées et l'utilisation d'angular sera impossible dans les applications hybrides dans le dernier iOS jusqu'à ce qu'Apple corrige ce bogue. Et c'est un gros problème je dirais.
Alors je ferais un essai.
@viattik Je suis tout à fait d'accord. Et d'ailleurs : Apple nous a fait savoir qu'il était peu probable qu'ils corrigent le bogue UIWebView. Alors en effet : essayez-le ;-)
Les amis, si vous pouviez publier ceci en tant que bug du kit Web, idéalement avec un cas de repro, je ferais un suivi avec certains de nos contacts du côté WebKit. https://bugs.webkit.org/
@naomiblack
Je ne sais pas si c'est un bug du webkit. Parce que cela ne se produit que dans UIWebView sur iOS9. Safari sur iOS9 fonctionne très bien.
@ raftheunis87 merci pour vos suggestions de code, a parfaitement fonctionné
@raftheunis87 @CleverCoder est un moyen de travailler avec ionic-angular ? Peux-tu être plus précis?
@abrahamrkj Je n'ai aucune expérience avec ionic. Mais leurs personnalisations sont-elles angulaires lors de l'utilisation d'ionic ? Sinon, je dirais que le même correctif fonctionnerait avec ionic-angular...
@ raftheunis87 https://github.com/driftyco/ionic/tree/master/js c'est l'angle qu'ils utilisent.
@CleverCoder +1 pour la demande de tirage. Je suis d'accord avec @viattik pour
Une pull request peut être dans un avenir proche, bien que j'hésite car je ne suis pas aussi proche de la base de code Angular que les autres. Je reviendrai bientôt sur la solution et essaierai de la rendre à l'épreuve des balles. Il semble étrange qu'une propriété de l'objet window.location ne change pas « immédiatement ». Dans les tests que j'ai effectués, j'ai remarqué que le changement persistait tant que les crochets d'événement « popstate » et « hashchange » n'étaient pas en place, ce qui m'amène à penser que la cause du changement différé peut en fait être faire quelque chose d'autre .. Peut-être que le moment de ces événements a changé (je pense que c'est ce que j'observais).
Je vais regarder cela au cours des prochains jours, et si rien de mieux ne fait surface, je creuserai un peu plus pour confirmer ce que je sais jusqu'à présent, et qu'il n'y a pas de meilleur endroit pour aborder le changement de comportement. Désolé si cela prête à confusion. Il se passe beaucoup de choses sous le capot que je ne comprends toujours pas complètement en ce qui concerne ces événements.
Acclamations!
... et oui, @borrull , je suis d'accord. Si Apple n'apporte plus de changements, alors il s'agit d'une bombe à retardement sérieuse qui conduira vraiment à une mauvaise presse et à un pointage du doigt. Je ne suis pas un fan des minuteries comme solution de contournement (je préférerais avoir un flux logique amélioré autour de ces propriétés intégrées), mais si nous ne pouvons pas dépendre de la valeur qui change une fois qu'elle est définie, alors où dessinons-nous le ligne? À quelles autres propriétés ne pouvons-nous pas faire confiance ? C'est étrange.
@CleverCoder Je voulais juste dire merci, votre patch a vraiment sauvé la journée !
@CleverCoder Merci pour la solution de contournement donnée.
J'ai dérivé une solution qui utilise la fonction de décorateur d'angular et vient sans patcher la source angulaire.
Avec cssua, cette configuration peut être configurée pour être utilisée uniquement dans des environnements spécifiques.
app.config(['$provide', ($provide) => {
$provide.decorator('$browser', ['$delegate', ($delegate) => {
var origUrl = $delegate.url;
var pendingHref = null;
var pendingHrefTimer = null;
var newUrl = function (url, replace, state) {
if (url) {
// setter
var result = origUrl(url, replace, state);
if (window.location.href != url) {
if (pendingHref != url) {
pendingHref = url;
if (pendingHrefTimer) clearTimeout(pendingHrefTimer);
pendingHrefTimer = setTimeout(function () {
if (window.location.href == pendingHref) {
pendingHref = null;
}
pendingHrefTimer = null;
}, 0);
}
}
return result;
} else {
// getter
if (pendingHref == window.location.href) {
pendingHref = null;
}
return pendingHref || origUrl(url, replace, state);
}
};
$delegate.url = newUrl;
return $delegate;
}]);
}]);
@CleverCoder Voir #12635
@jd-carroll : C'est vraiment intéressant. J'y reviendrai peut-être un peu plus tard dans la journée, quand j'aurai le temps. Assez inondé de trucs. Cela crée juste plus de mystère, car cela semble être un problème distinct qui ne devrait pas introduire de retard dans la mise à jour des valeurs de location.*.
@realityfilter : C'est marrant que tu mentionnes le décorateur... Je viens juste de finir d'implémenter quelque chose en utilisant la fonctionnalité du décorateur angulaire. Agréable!
Salut à tous,
Je voulais juste ajouter que ce correctif a introduit un bogue dans notre code qui était facile à corriger.
Nos modèles avaient des balises d'ancrage qui utilisaient href="#" et ng-click="someCall()". Le href provoquait le passage du site à index.html à l'aide de ce correctif. La suppression du href a résolu le problème.
Notre application se brise pendant la navigation du bouton de retour dans Ionic, elle passe d'abord à la nouvelle vue, puis revient partiellement à l'ancienne vue, puis revient à la nouvelle vue sur IOS9 bêta toutes les résolutions pour Ionic
Même problème avec iOS 9 beta 5 13A4325c, Angular 1.4.0 (avec cordova-ios 3.9.1). Espérons que le bogue UIWebView sous-jacent sera corrigé !
Même problème sur Angular v1.2.27
Je l'ai retracé jusqu'à la version 1.2.27, le bogue n'est pas dans la version 1.2.26 précédente.
Plus précisément, ce commit est le coupable.
@damrbaby On dirait que je pourrais avoir quelque chose à voir avec ça.
Mais le fait qu'il fonctionne avec la dernière version d'angular dans Mobile Safari clarifie qu'il doit faire quelque chose avec uiWebView sur iOS 9. Ainsi, le changement qu'ils ont apporté au code source d'Angular n'est pas nécessairement une mauvaise chose.
@CleverCoder @realityfilter @jyc66 Je voulais juste te dire merci, tu viens de me sauver la journée.
Le problème est toujours présent sur iOS9 GM Seed, alors mettez vos applications à jour !
Je peux confirmer que le problème est toujours présent dans iOS9 GM (13A340)
Cela signifie donc qu'Apple a cassé quelque chose et que nous devons à nouveau mettre à jour nos applications (dont certaines n'ont pas changé depuis des mois, voire plus d'un an) pour les empêcher de planter. Cela a du sens :( . Je préférerais qu'Apple le répare pour les lancements d'iOS9. Passer à la dernière version angulaire dans une ancienne application risque de casser d'autres choses également.
Je doute fortement qu'Angular soit le seul framework à avoir des problèmes avec iOS9 ?
Ainsi, @adamdbradley , @perrygovier et @mhartington de l'équipe Ionic ont travaillé toute la journée sur un correctif qui fonctionnera également pour Ionic et pour les applications angulaires simples. L'objectif est d'être un correctif instantané qui ne nécessite pas de modification d'Angular et qui fonctionnera (espérons-le) sur la plupart des versions 1.2+ d'Angular.
Voici notre solution groupée actuelle qui décore et corrige $browser
en appliquant ce correctif . Remarque: ceci est basé sur Angular 1.4.3 et est en quelque sorte un "clone avec correctifs" de browser.js
d'Angular proprement dit : https://github.com/driftyco/ionic/blob/ios9-patch/js /angular/service/decorators/ios9-browser-fix.js
Nous avons également placé le patch sur notre CDN. Je ne recommande pas d'utiliser le fichier CDN pour la production, il est uniquement là, il est donc plus facile de tester avec maintenant.
Pour le tester, placez cette balise de script sous votre fichier angulaire ou ionic.bundle.js :
<script src="https://code.ionicframework.com/patch/ios9-$browser-patch.js"></script>
De plus, il applique actuellement le correctif, que vous utilisiez ou non iOS9. Cela sera bientôt corrigé de sorte qu'il ne fonctionne que sur iOS 9 UIWebView.
Suivez le numéro Ionic correspondant ici : https://github.com/driftyco/ionic/issues/4082#issuecomment -139079725
Salut tout le monde,
UI-sref fonctionne comme un charme mais $state.go casse l'animation du bouton de retour
et la page scintille beaucoup même après avoir appliqué ce correctif.
Salutations,
Ajay Singh
Le jeudi 10 septembre 2015 à 6h23, Max Lynch [email protected] a écrit :
Alors, @adamdbradley https://github.com/adamdbradley , @perrygovier
https://github.com/perrygovier et @mhartington
https://github.com/mhartington de l'équipe Ionic a travaillé
toute la journée sur un correctif qui fonctionnera pour Ionic et pour les applications angulaires simples comme
bien. L'objectif est d'être un correctif instantané qui ne nécessite pas de modification
Angular, et fonctionnera (espérons-le) sur la plupart des versions 1.2+ Angular.Voici notre solution groupée actuelle qui décore et corrige $browser en
appliquer ce patch
https://github.com/angular/angular.js/issues/12241#issuecomment -130744518.
Remarque: ceci est basé sur Angular 1.4.3 et est en quelque sorte un "clone avec correctifs" de
browser.js à partir d'Angular proprement dit :
https://github.com/driftyco/ionic/blob/ios9-patch/js/angular/service/decorators/ios9-browser-fix.jsNous avons également placé le patch sur notre CDN. Je ne recommande pas d'utiliser le fichier CDN
pour la production, c'est seulement là, donc c'est plus facile à tester pour le moment.S'il vous plaît, testez-le et dites-nous comment cela se passe, merci.
Pour le tester, placez cette balise de script sous votre angle ou
fichier ionic.bundle.js :Also, right now it applies the patch whether you're running on iOS9 or
not. That will soon be fixed such that it runs only on the iOS 9 UIWebView.—
Reply to this email directly or view it on GitHub
https://github.com/angular/angular.js/issues/12241#issuecomment-139082474
.
Je peux confirmer que ce bug est toujours présent dans iOS 9.1 Beta 1
Nous utilisons beaucoup $state.go
et il vacille toujours entre les états / ne fait pas la transition correctement.
Désolé, le correctif fonctionne pour notre application maintenant, la seule chose est que nous devons inclure https
Le lien CND au lieu de http CDN ressemble à ios9 n'autorise que https à l'intérieur du
app donc après avoir utilisé https notre application a fonctionné.
https://code.ionicframework.com/patch/ios9- $browser-patch.js
Le jeu. 10 sept. 2015 à 15h22, Tyler Crammond notifications@github.com
a écrit:
Nous utilisons beaucoup $state.go et il vacille toujours entre les états / pas
transition correcte.-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/angular/angular.js/issues/12241#issuecomment -139189216
.
ios9-$browser-patch.js fonctionne aussi pour moi. Mais cela génère des erreurs jshint. Existe-t-il un moyen de contribuer au correctif pour aider à supprimer les erreurs ?
Je ne pense pas que ce correctif soit entièrement sain car il ne vous permet pas de mettre à jour l'emplacement depuis l'extérieur d'Angular. Ce n'est probablement pas un problème pour la plupart des applications mais nous travaillons pour voir s'il existe une meilleure solution...
ios9-$browser-patch.js n'a pas fonctionné pour moi. Lorsque je passe de ma vue de liste à une vue détaillée, j'utilise $state.go() pour me déplacer entre les pages. La première fois que je fais cela, il glisse de l'autre côté puis revient tout droit, puis je clique à nouveau et cela fonctionne. UI-sref fonctionne comme vous le souhaitez, mais cela ne me permettra pas de faire la logique conditionnelle que je dois faire.
Malheureusement télécharger le patch, le stocker et le charger depuis ./lib/ (j'ai vérifié qu'il est chargé), n'a rien changé pour moi :
Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.13/$rootScope/infdig?p0=10&p1=%5B%5D
iOS 9 GM, ionique 1.0.0.
Jorisw, essayez de désactiver le code de détection ios9 et voyez si cela fonctionne :
var isIOS9 = (navigator.userAgent.indexOf('Version/9.') != -1) && (navigator.appVersion.indexOf('9_0') != -1);
si (!isIOS9) {
// ne pas patcher si ce n'est pas iOS9 UIWebView
renvoie $browser ;
}
@ jyc66 Cela fonctionne, merci. Comment m'assurer qu'il ne casse pas iOS < 9 ?
La méthode isIOS9
est défectueuse. Il doit vérifier :
> navigator.userAgent
< "Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340 (2065230368)" = $1
> navigator.appVersion
< "5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340 (2065230368)" = $2
Oui, vous pouvez également tester les systèmes d'exploitation inférieurs à 9 et désactiver le correctif dans ces cas. La vérification actuelle s'arrêtera sur iOS 9.1 qui sortira également bientôt.
Je fais ça maintenant, jusqu'à ce que moi ou quelqu'un en trouve un meilleur :
// only provide the patch for iOS9 on UIWebView
var isIOS9 = (navigator.userAgent.indexOf(' OS 9') != -1) && (navigator.appVersion.indexOf(' OS 9') != -1);
if (!isIOS9) {
// do not patch if not iOS9 UIWebView
return $browser;
}
Ouais, c'est similaire à ce que je fais.
Est-ce que quelqu'un sait si l'application du correctif aux versions iOS >= 9.0 entraînera des problèmes si/quand Apple résout le problème dans une version ultérieure d'iOS ?
@JeremyPlease, je charge la version 9.1 bêta en ce moment et je vais le vérifier
A fonctionné pour moi lorsque j'ai désactivé la vérification de l'agent utilisateur, en servant le correctif dans le cadre du bundle minifié. C'est une application angulaire non ionique. J'enquêterai plus tard ce soir et je m'assurerai que tout fonctionne comme prévu.
Merci à l'équipe ionic pour l'effort fourni!
Donc, 9.1beta one n'a pas encore le correctif. Pas surpris.
Cela peut sembler étrange - mais quelqu'un voit-il que la fonction String.split() ne fonctionne pas correctement lorsque le correctif est appliqué sur iOS 9 ? (testé jusqu'à présent uniquement sur simulateur). Voici une capture d'écran du débogueur de Safari : https://www.dropbox.com/s/hxgct9y0f9z6yci/Screenshot%202015-09-11%2000.40.26.png?dl=0
Je suis perplexe ! Fonctionne bien sur iOS8.4 et Chrome bien sûr.
Mise à jour : String.split ne semble pas fonctionner dans le simulateur iOS 9 iPhone 6 et 6s pour moi, rien à voir avec le patch.
Au fait, voici ce que j'ai utilisé pour la vérification de l'agent utilisateur :
var isIOS9WebView = (navigator.userAgent.indexOf('Safari') === -1) && (navigator.appVersion.indexOf('OS 9') !== -1);
if (!isIOS9WebView) {
// do not patch if not iOS9 UIWebView
return $browser;
}
Je pense que la meilleure solution est peut-être la pull request d'Igor, mais cela fonctionne pour moi sans appliquer le correctif sur iOS 9 Safari, mais uniquement sur UIWebView.
@dac09 Je veux tester votre commentaire, mais je ne sais pas quel fichier doit être modifié...
pouvez-vous me dire quel fichier doit être modifié ?
J'utilise le correctif de
Salut les gens, pouvez-vous s'il vous plaît tester ce patch : https://gist.github.com/IgorMinar/863acd413e3925bf282c
Il devrait fonctionner avec Angular 1.2 - 1.4.5 et ne nécessite aucune mise à jour angulaire. Les instructions sur la façon d'appliquer cela à votre application sont dans l'essentiel.
Nous allons avoir un correctif approprié dans la 1.4.6, mais en attendant, ce correctif autonome est destiné à faciliter la mise en œuvre et le déploiement d'un correctif afin que vous puissiez le déployer rapidement.
Salut @IgorMinar -
TypeError non capturé: angular.module(...).decorator n'est pas une fonction (fonction anonyme) @ angular-ios9-uiwebview.patch.js:33
@rajatrocks euh.. bon point. module.decorator est une fonctionnalité 1.4 uniquement. laissez-moi changer le patch.
@rajatrocks j'ai mis à jour l' essentiel
Merci @IgorMinar , "s'installe" bien maintenant. Je laisserai mes commentaires sur le fil Ionic car ils sont plus liés à cela.
@IgorMinar J'ai inclus votre fichier js et j'ai ajouté ce qui suit dans mon app.js. Cela ne résout pas mon problème.
@IgorMinar Votre correctif n'a pas @mlynch l'a fait.
Pour m'assurer qu'il ne s'applique qu'à la plate-forme iOS, j'ai créé un simple crochet Cordova :
https://gist.github.com/DURK/f2acd6bca4759e719801
Mise à jour : Ah, je vois que le patch contient maintenant un chèque donc il n'est appliqué que sur iOS9.
@IgorMinar Suite à ce que @DURK et @jprangenberg ont signalé, il semble y avoir un problème avec la fonction "isIOS9UIWebView" lors du test sur un iPad Air 2. Si je force la cale à toujours être appliquée, le correctif fonctionne.
De mon commentaire sur : https://github.com/driftyco/ionic/issues/4082#issuecomment -139567128
@IgorMinar , votre correctif fonctionne très bien sur iOS 9 iPhone UIWebView, mais il y a quelques problèmes avec la détection de l'agent utilisateur pour iPad.
Agent utilisateur iPhone iOS 9 dans UIWebView :
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340
Agent utilisateur iPad iOS 9 dans UIWebView :
Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340
L'expression régulière qui correspondra de manière fiable à tous ces éléments est :
function isIOS9UIWebView(userAgent) {
return /(iPhone|iPad|iPod);.*OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
}
J'ai forké l' essentiel de https://gist.github.com/JeremyPlease/72cb3bf98279fefed4e3
Le crochet
@JeremyPlease Safari sur iOS9 n'est pas affecté. nous voulons vraiment appliquer le correctif uniquement dans UIWebView.
@JeremyPlease Safari iOS 9 n'est pas le problème, donc la vérification de
Fonctionne très bien pour moi.
J'ai réalisé qu'il ne s'agissait que d'un problème dans UIWebView, j'ai donc mis à jour mon message pour ne pas l'appliquer dans Safari :
function isIOS9UIWebView(userAgent) {
return /(iPhone|iPad|iPod);.*OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
}
J'ai publié la v1.0.3 du patch
@IgorMinar Ce correctif fonctionne-t-il uniquement si vous utilisez ngRoute ? Le correctif ne fonctionne pas pour moi… :-(
@jprangenberg oui. mon application avec ngroute fonctionne bien sur iphone/ipad. pouvez-vous fournir plus de détails? assurez-vous également que vous utilisez la version 1.0.3+ du correctif
@IgorMinar La version 1.0.3 du correctif fonctionne correctement dans mon environnement.
index.html :
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="lib/ngCordova/dist/ng-cordova.min.js"></script>
<script src="js/libs/angular-ios9-uiwebview.patch.js"></script>
app.js :
angular.module('starter', [
'ionic',
'ngCordova',
'ngIOS9UIWebViewPatch',
'ionic.service.core',
'ionic.service.push',
'angular-loading-bar',
'starter.services',
'starter.controllers'
])
app.js (Itinéraire) :
$stateProvider.state('app.regions', {
cache: false,
url: "/states/:state_id/regions",
views: {
'menuContent': {
templateUrl: "templates/regions.html",
controller: 'RegionsCtrl'
}
}
})
Il n'est pas possible de naviguer dans l'application. Si vous cliquez sur un élément de la liste, vous voyez la vue actuelle. Le bouton d'historique change. Si vous cliquez sur le bouton d'historique, vous pouvez voir la vue du clic sur l'élément de liste.
<ion-list>
<ion-item ng-repeat="state in states" href="#/app/states/{{state.id}}/regions">
{{state.name}}
</ion-item>
</ion-list>
@IgorMinar Cela ne fonctionne pas pour moi. Est-ce que quelqu'un a des idées ?
@jprangenberg utilisez-vous la version corrigée du bundle Ionic ou une version ?
@perrygovier j'utilise la version 1.0.3 de @IgorMinar
@jprangenberg à droite, mais le ionic.bundle.js. C'est quelle version ?
Version de mon ionic.bundle.js :
window.ionic.version = '1.0.0';
@perrygovier Merci pour votre aide !
Par curiosité, est-ce que l'utilisation de la version 1.1.0 du bundle est utile ?
http://code.ionicframework.com/1.1.0/js/ionic.bundle.min.js
Vous aurez probablement aussi besoin du CSS mis à jour
http://code.ionicframework.com/1.1.0/css/ionic.min.css
Hé @jprangenberg , pendant que nous travaillons tous dessus ensemble, poursuivons cette discussion liée aux ions sur le problème ionique afin de ne pas spammer les utilisateurs angulaires réguliers driftyco/ionic#4082
Donc, ce bogue n'affecte pas WKWEBVIEW lors de l'utilisation de https://github.com/Telerik-Verified-Plugins/WKWebView ?
Le bogue est uniquement dans UIWebView d'iOS 9. Il n'est pas présent lors de l'utilisation de WKWebView.
Merci pour votre travail sur ces gars, mais cela ne fonctionne pas pour moi malheureusement. J'obtiens des animations cassées, des pages qui ne se chargent pas du tout, des pages qui ne se chargent pas correctement, fondamentalement, le routeur est complètement bancal.
J'utilise Ionic bundle 1.1.0 et iOS 9.1 sur un iPhone 6, avec le fichier de correctif sur https://code.ionicframework.com/patch/ios9- $browser-patch.js. Je vois des erreurs comme celle-ci :
Erreur : [$ rootScope:infdig ] 10 itérations $digest() ont été atteintes. Abandonner !
Observateurs tirés au cours des 5 dernières itérations : []
Aucune suggestion?
Merci!
@scottopolis as -tu essayé le patch d'Igor : https://gist.github.com/IgorMinar/863acd413e3925bf282c
@petebacondarwin ya merci, le patch d'Igor fonctionne pour moi. Mes animations de transition de page sont saccadées, mais le routeur semble être réparé. Je vais garder un œil sur ce problème.
Certains tests ici et le correctif de @IgorMinar posent des problèmes avec les animations et les contrôleurs du bouton de retour. Je vois le contrôleur de l'écran que je renonce à être créé à nouveau lorsque je clique en arrière. Cela provoque l'exécution d'animations dans cette vue lorsqu'elle est naviguée hors de l'écran, toutes sortes de choses étranges.
Jusqu'à présent, je ne vois aucun problème à utiliser le nightly d'ionic mais à mettre à jour la détection iOS9.
var userAgent = navigator.userAgent,
isIOS9 = /(iPhone|iPad|iPod).* OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
Je viens de pousser la v1.1.0 du patch : https://gist.github.com/IgorMinar/863acd413e3925bf282c
Avec l'équipe ionic, nous ne sommes plus en mesure de reproduire le moindre scintillement avec cette version du patch.
Veuillez mettre à niveau et laissez-nous savoir si vous voyez d'autres problèmes. (assurez-vous également que vous n'utilisez pas d'autres correctifs pour ce problème en plus de la version 1.1.0 du correctif).
Nous allons débarquer un correctif dans le maître la semaine prochaine, afin qu'Angular v1.4.6 n'ait plus besoin d'être corrigé.
Cette nouvelle version du patch fonctionne parfaitement pour moi. Merci @IgorMinar !
La version 1.4.6 résout-elle ce problème pour de bon ?
@alexislg2 - oui, cette version devrait résoudre le problème, vous n'avez donc pas besoin d'appliquer le correctif.
Confirmé, fonctionne pour moi sur le simulateur et l'appareil, il suffit que mes utilisateurs attendent 2 semaines pour l'approbation d'Apple ;-(
@dbroadhurst J'ai entendu dire que vous pourriez citer le rapport de bogue https://openradar.appspot.com/22186109 pour accélérer la mise à jour de votre application.
Vous pouvez suivre ce bogue WebKit pour les mises à jour.
Salut, vous semblez avoir résolu le problème de l'appel asynchrone iOS9 sur le changement de hachage sur Angular.js.
J'ai fait des recherches, également publiées sur stackoverflow mais la seule solution que j'ai trouvée jusqu'à présent est dans votre patch angulaire browser.js.
Je ne suis pas vraiment familier avec angular et j'aimerais comprendre ce que vous avez fait pour vous rendre disponible dans
chaque application Web basée sur le routage de hachage
Pouvez-vous expliquer comment vous avez identifié et résolu le problème ?
@lchenneberg - le commit qui résout le problème dans AngularJS est ici https://github.com/angular/angular.js/commit/8d39bd8abf423517b5bff70137c2a29e32bff76d
Le problème est que ce navigateur particulier ne met pas à jour la valeur de window.location.href
jusqu'à la prochaine exécution de la boucle d'événement JavaScript. Cela signifie que si vous écrivez dans cette valeur puis la relisez immédiatement, vous obtenez une valeur différente :
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
Notez que le deuxième console.log
renvoie l'ancienne valeur, pas la nouvelle valeur. Une fois la boucle d'événement actuelle terminée, la valeur est mise à jour, comme on peut le voir dans le troisième console.log
Le correctif que nous avons trouvé consiste à mettre en cache la valeur que nous avons écrite, si le navigateur ne se met pas à jour de manière synchrone, puis à utiliser cette valeur à partir de ce moment, au lieu de la valeur renvoyée par window.location.href
, jusqu'à il y a un événement hashchange
, qui nous dit que le navigateur s'est enfin réglé.
J'espère que cela pourra aider.
Le patch de @IgorMinar a bien fonctionné pour moi. J'utilise les versions suivantes d'Angular & Ionic :
window.ionic.version "1.0.1"
angular.version
Object {full: "1.3.13", major: 1, minor: 3, dot: 13, codeName: "meticulous-riffleshuffle"}
Le patch de @IgorMinar a également fonctionné pour nous. Merci!!
Mais j'ai une autre question à laquelle l'un d'entre vous pourra peut-être répondre :
Ou, plus important encore, accéder à une application Web de cette manière profite-t-il du moteur de rendu Nitro ?
@tpeiffer ils utiliseraient wkwebview, car c'est juste un safari sans barre d'adresse.
Salut, j'ai exactement le même problème avec une ancienne version d'angular: 1.0.6
Je vois que tous les correctifs concernent les versions plus récentes, savez-vous où devrais-je chercher pour voir si je peux résoudre ce problème ? Merci.
@tzamora Avez-vous essayé d'appliquer le patch de @IgorMinar ? Peut-être que la version 1.0.6 est trop tôt pour que cela fonctionne.
@petebacondarwin le patch de
Pour info, un correctif pour le problème sous-jacent a atterri dans WebKit l'autre jour :
http://trac.webkit.org/changeset/190092
http://trac.webkit.org/changeset/190100
Je l'ai fait fonctionner avec le patch js, mais pas tout de suite. Nouveau dans ce domaine (angularjs et Ionic), donc si quelqu'un pouvait vérifier cela et me faire savoir si j'ai raté quelque chose de majeur, je l'apprécierais vraiment! (par exemple, l'objet de la plate-forme est-il très inefficace, etc.)
Noter:
function isIOS9UIWebView(userAgent) {
return (/9\.[0-9]\.[0-9]/.test(ionic.Platform.version()) && /iOS/.test(ionic.Platform.device() ));
//return true;
//return (navigator.userAgent.indexOf(' OS 9') != -1) && (navigator.appVersion.indexOf(' OS 9') != -1);
//return /(iPhone|iPad|iPod).* OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
// only provide the patch for iOS9 on UIWebView
}
J'ai rencontré ce problème sur 8.4 sur le simulateur ; donc je ne pense pas que cela se limite à iOS 9. Je viens de mettre à jour la vérification de la chaîne de l'agent pour inclure les versions iOS 8 et 9. Voici la chaîne de l'agent.
"Mozilla/5.0 (iPhone ; CPU iPhone OS 8_4 comme Mac OS X) AppleWebKit/600.1.4 (KHTML, comme Gecko) Mobile/12H141 (140307121489296)"
+1
salut
Quelqu'un peut-il confirmer si cela a été résolu sur ios 9.2? (bêta)
Merci :)
Je ne peux pas reproduire le problème à partir de la mise à jour de ce matin vers iOS 9.2 (13C75) sur iPhone 6. Ça a l'air bien jusqu'à présent. Ce bogue est toujours ouvert - https://openradar.appspot.com/22186109
Si ce correctif est appliqué, pourrait-il avoir un effet négatif sur iOS 9.2 et versions ultérieures ? Je vais tester cela avec notre propre application, mais je veux m'assurer que je n'introduis pas de problèmes qui n'apparaissent pas lors du test de notre situation particulière.
Autant que je sache, tous les correctifs utilisent une expression régulière qui filtre iOS 9 et versions ultérieures, mais pas spécifiquement 9.x jusqu'à 9.1 inclus.
Hé les gars, ce problème se produit actuellement dans l'iPhone 6 avec iOS 9, quelqu'un peut-il me dire pourquoi ?
https://forum.ionicframework.com/t/ios-9-beta-slide-menu-app-transition-issue/30768
dois-je appliquer un autre patch ? S'il vous plaît laissez-moi savoir, j'ai vraiment besoin de résoudre ce problème de chevauchement d'écran.
La mise à jour vers iOS 9.2 semble le résoudre pour moi aussi.
@bruno-serfe il s'agit d'un problème sur la façon dont iOS gère window.location
qui n'est présent que dans iOS 9.0.x. Si vous pouvez mettre à jour vers Angular 1.4.6+, vous n'avez rien d'autre à faire car cette version contient le correctif. Si vous ne pouvez pas mettre à niveau, le correctif sur https://github.com/angular/angular.js/issues/12241#issuecomment -139446288 a le même correctif.
Comme indiqué précédemment, ce problème n'est présent que dans iOS 9.0.x car il a été corrigé dans iOS 9.1.0.
Le problème publié sur ionic ressemble au même problème, donc le même correctif devrait fonctionner dans les deux sens.
@lgalfaso merci pour la réponse, je vais essayer de corriger une erreur de résumé que j'ai trouvée, si cela ne résout pas le problème, je vais essayer de mettre à niveau angulaire, merci pour la réponse !.
Merci @lgalfaso :+1:
J'ai eu ce problème lorsque j'ai ajouté l'application Web à l'écran d'accueil et que je l'ai utilisée de manière autonome, mais la mise à niveau d'AngularJS 1.4.5 à 1.5 a complètement résolu le problème et accéléré la navigation comme un diable !
@volgwfang Le problème que vous rencontrez n'est pas lié à ce sujet ?
Commentaire le plus utile
Je suis allé un peu plus loin sur celui-ci. J'ai fait un changement dans Angular concernant l'emplacement.
Dans la partie "navigateur de mise à jour", j'ai changé le $rootScope.$evalAsync en $rootScope.$applyAsync.
Les deux méthodes semblent faire exactement la même chose. La différence ne devient évidente que lorsque vous regardez l'exécution réelle de $digest. Lorsque AngularJS exécute un condensé, il parcourt l'arborescence Scope et exécute les liaisons $watch() jusqu'à ce qu'aucune donnée sale ne soit produite. Au cours de ce cycle de vie, la file d'attente $applyAsync() et la file d'attente $evalAsync() sont vidées ; mais, cela se produit dans deux endroits très différents.
La file d'attente $applyAsync() n'est vidée qu'en haut de $digest avant qu'AngularJS ne commence à rechercher les données modifiées. En tant que telle, la file d'attente $applyAsync() sera vidée, au plus, une fois au cours d'un $digest et ne sera vidée que si la file d'attente était déjà remplie avant le début de $digest.
La file d'attente $evalAsync(), d'autre part, est vidée en haut de la boucle while qui implémente le "dirty check" à l'intérieur du $digest. Cela signifie que toute expression ajoutée à la file d'attente $evalAsync() lors d'un condensé sera exécutée ultérieurement dans le même condensé.
Pour rendre cette différence plus concrète, cela signifie que les expressions asynchrones ajoutées par $evalAsync() à partir d'une liaison $watch() s'exécuteront dans le même condensé. Les expressions asynchrones ajoutées par $applyAsync() à partir d'une liaison $watch() s'exécuteront à un moment ultérieur (~10ms).
J'espère que cela aidera déjà certains d'entre vous :-).