次ã®åçŽãªHTMLã¯ããã®åé¡ã瀺ããŠããŸãã
<!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>
ããã¯ã»ãšãã©ã®ããã€ã¹ã§æåŸ
ã©ããã«å®è¡ãããŸãããiOS9ã§ã¯ç¡éãã€ãžã§ã¹ãäŸå€ãã¹ããŒãããŸãã
iOS9ããŒã¿2ãæèŒããiPadAir2ãšiPad第4äžä»£ã®äž¡æ¹ã§åçŸã§ããŸãã
ããã¯ããããiOSã®åé¡ã ãšæããŸãããããã§ã調æ»ãã䟡å€ããããããããŸããã
ç§ã¯iOS9ã§çºçããåæ§ã®åé¡ã«ééããŸããããä»ã®ããã€ã¹ã§ã¯åé¡ãªãåäœããŸãã
ç§ã¯1.4.1 / ios9ã§santaslowã«ãã£ãŠæäŸãããã®ãšåãã³ãŒãã§ãã®åé¡ãåçŸããŸããïŒ
<!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>
äžèšã®ã³ãŒãã¯ããã¹ã¯ããããã©ãŠã¶ãAndroidãããã³iOS 8 Webãã¥ãŒã§æ£åžžã«å®è¡ãããŸãããiOS 9ã§ã¯ããªã³ã¯ãã¯ãªãã¯ãããšäŸå€ãã¹ããŒãããŸã
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
iOS 9 Beta3ã§ã¯åçŸã§ããªããªããŸããã
iOS9ãããªãã¯ããŒã¿ïŒ13A4293gïŒã§ãåããšã©ãŒãçºçããŸã
ç§ã¯iOS9ããŒã¿3ïŒ13A4293gïŒã§äžèšã®ã³ãŒããæ€èšŒããŸããããããäŸå€ã¯ãããŸããã ãã ããng-viewã䜿çšããã¢ããªã¯ãiOS9ããŒã¿3ã§infdigäŸå€ãã¹ããŒããŸãã
iOS9ãããªãã¯ããŒã¿ïŒ13A4293gïŒã§ãåããšã©ãŒãçºçããŸã
ãšã©ãŒïŒ[$ rootScopeïŒinfdig ] 10åã®$ digestïŒïŒå埩ã«éããŸããã äžçµ¶ïŒ
ãŠã©ããã£ãŒã¯éå»5åã®å埩ã§è§£éãããŸããïŒ[]
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
$ dialog
$ apply @ 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ïŒ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 ïŒ///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:11713:25
dispatchEvent @ [ãã€ãã£ãã³ãŒã]
triggerMouseEvent @ 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:2863:20
tapClick @ 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:2852:20
tapTouchEnd @ 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:2975:13
ç¬èªã®Angularã¢ããªã±ãŒã·ã§ã³ã䜿çšããiOS9ã®ãããªãã¯ããŒã¿3ã§ããã®ãšã©ãŒãçºçããŸãã iOS8ã§ã¯çºçããŸããã
åé¿çãšããŠãng-viewãšangular-route.jsã眮ãæããç°¡åãªãã£ã¬ã¯ãã£ããäœæããŸããã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ãã¡èªèº«ã®ã¢ããªã±ãŒã·ã§ã³ã§ããŸãæ©èœãããã¹ãŠã®infdigäŸå€ã¯ios9ããŒã¿/ããŒã¿3ã§æ¶ããŸããã以äžã¯ç§ãã¡èªèº«ã®ã¢ããªã±ãŒã·ã§ã³å°çšã®ç°¡ç¥åãããã³ãŒãã§ãããäžè¬çãªäœ¿çšäŸã¯èæ ®ãããŠããŸããã ä»ã®äººã«ããã䜿çšããããšã¯ãå§ãããŸããïŒ
(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)
iOS 9 Beta 4ãã€ã³ã¹ããŒã«ããã°ããã§ãããåãåé¡ãçºçããŸãã ä»ã®èª°ãïŒ
iOS 9 Beta 3ã§èŠãŸããããiOS 9 Beta4ã§ãèŠãŠããŸãã
+1
ãããè§åºŠã®ããUIã«ãŒã¿ãŒã§ãåãåé¡ãçºçããŠããŸãã ãããŸã§ã®éããã®åé¡ã®æå¹ãªåé¿çã¯ãããŸããïŒ
ææ°ã®iOS9ã®uiWebViewã§åãåé¡ãçºçããŠããŸãã
誰ãããã®åé¡ã«é¢ããæŽæ°ãæã£ãŠããŸããïŒ
ããã¯ãŸã åé¡ã§ãã åé
iOSã®åé¡ã®ããã§ãã ããã¯Webkitã®ã©ããã§è¿œè·¡ãããŠããŸããïŒ
+1
+1
ãã£ã¡ãäžç·ã ç§ãã¡ã®Cordovaã¢ããªã¯ãiPad Safariã§WebãšããŠå®è¡ããŠããå Žåã¯æ£åžžã«å®è¡ãããŸãããCordovaã¢ããªïŒUIWebViewïŒãšããŠå®è¡ããŠããå Žåã¯ç¡éã®ãã€ãžã§ã¹ããçºçããŸãã
@borrullãšãŸã£ããåãåé¡ã§ãïŒ ãã§ã«WKWebViewã§å®éšããŠãããåé¡ã¯ååšããŸããã ãã ããããŒã«ã«ãã¡ã€ã«ãµãŒãã³ã°ïŒããã³ã¢ããªã±ãŒã·ã§ã³ã§ããŒã«ã«ãµãŒããŒãå®è¡ããããªãïŒãšCookieãå¿ èŠãªãããWKWebViewã䜿çšããããšã¯ã§ããŸããã ãã®ãããiOS9ã®Cordova / MobileSafariãšçµã¿åãããUIWebViewã§äœããè¡ãå¿ èŠããããŸããã¢ããªã±ãŒã·ã§ã³ãå¥ã®å Žæã«è€æ°åïŒ10ååŸã«ïŒç§»è¡ãããã®ã§ãçŸåšAngularã§$ locationWatchããããã°ããŠããŸãã ïŒãã€ãžã§ã¹ããšã©ãŒãã¹ããŒãããŸãã
iOS9béta4ã§ãåãåé¡ãçºçããŸã
è§åºŠã®ããç¡éã®$ digestã«ãŒã;ïŒ
+ 1ãUIWebViewã§ã®ã¿ãWKWebViewã§ã¯ãããŸããããcordovaã¢ããªã§ã®ã¿UIWebViewã䜿çšã§ããŸãã
+1
ãããiOSåºæã®åé¡ã§ããå Žåã¯ãWebkitã®åé¡è¿œè·¡ã·ã¹ãã ã§åé¡ãéããŠãã¢ãæäŸããŠãã ããã ããã§ã®+1ã¯ãå®éã«ã¯ãã©ãŠã¶ã®ãã°ã®ããã«èãããã®ã§ãäœãå€æŽãããªãå¯èœæ§ããããŸãã
誰ãããã®ãã°ã調æ»ã®ããã«Appleã«å ±åããŸãããïŒ
ãã®ãã°ãã¢ããã«ã«å ±åããŸããã ãããããã°ã«æ³šæãåããããã«ãçãããåãããšãããå¿ èŠããããããããŸããã
+1ã§ããããã«ãªã³ã¯ãæããŠããã ããŸããïŒ
ããã¯ãã°ã¬ããŒã¿ãŒãä»ããŠç§ãã¡ã®å人çãªã¢ããã«ã¢ã«ãŠã³ãã«ãããŸã..ãããã£ãŠããããªãã¯ãªã³ã¯ã¯ãããŸãã;ïŒ
ãããopenradarã«æçš¿ããrdar idãå ±æããŠãè€è£œã§ããããã«ããŠãã ããã
iOS9béta5ã§ãåãïŒ
ã¢ãã€ã«ãµãã¡ãªã§åäœããŸã
ããŒã«ã«ãã¡ã€ã«ãæäŸã§ãããNSProtocolããµããŒãããŠããªããã䜿çšã§ããªãWKWebviewã§åäœããŸã
UIWebViewã§ã¯æ©èœããŸãã
ããIOS9 Beta5ã§ãåãã§ã
Appleã«ããã°ãå ±åããŸããã Open Radarã®ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ @santaslowã«æè¬ã
åãXcodeãããžã§ã¯ãã®ããŒãžã§ã³ïŒ@borrullããïŒãäœæããŸããããng-routeã®ä»£ããã«ui-routerã䜿çšããŠããŸãã ãŸã£ããåãåé¡ã èå³ã®ãã人ã®ããã«ãããªãã¯ããã§ãããžã§ã¯ããèŠã€ããããšãã§ããŸãïŒ http ïŒ
ãã®ããã«åé¡ãçºçããŠããŸãã è§åºŠãæ··åšããŠããå Žåãlocationã*ããããã£ãããã«æŽæ°ãããªããšããåé¡ã远跡ããããšãã§ããŸããã location.hashã«å€ãå²ãåœãŠãããšããŠïŒäœçœ®æ å ±ãµãŒãã¹ã®èåŸã§è¡ãããŠããããšã®ããã«ïŒãããã«ãããèªã¿æ»ãããšããŠããå€ã¯å€æŽãããŠããŸããã popstateã€ãã³ããšhashchangedã€ãã³ãã«ã¢ã¿ãããããjqliteãã³ãã©ãŒã®çµæãšããŠãããã€ãã®å¯äœçšãçºçããŠããããã§ãã
ã³ã³ãã¥ãŒã¿ãŒã䜿çšããŠãããšãã«ãµã³ãã«ãã¢ããããŒãããŠã¿ãŸãã
+1
@CleverCoderãµã³ãã«ã®æŽæ°ã¯ãããŸããïŒ
ç§ã¯é±æ«äžãã£ãšææãããŠããã®ã§ãç§ã¯ååäžã«åçŸã±ãŒã¹ãçµäºããå¿ èŠããããŸãã ãããžãããããšãïŒ iOS 9ãã«ãŠã³ãããŠã³ããã«ã€ããŠãç§ãã¡ã¯ããã解決ãããã®ãèŠãããšã«æ¢åŸæš©çãæã£ãŠããŸãã ã§ããã ãæ©ãäœããã¢ããããŒãããŸãã
+1
ãã±ãŒã·ã§ã³ããã·ã¥ãŸãã¯hrefããããã£ã®èšå®ãããã«ãé©çšããããªããæ ¹æ¬çãªåå ã§ãããšç§ãä¿¡ããŠããããšãåçŸããŸããã
XCodeãããžã§ã¯ããžã®ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãã
https://www.dropbox.com/s/2jkwv2thhm86nly/iOS%209%20Location%20Bug.zip?dl=0
ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããªãå Žåã¯ãç¥ãããã ããã
location.hashã§çµæã®å€ã確èªããSafariããããã°ã«ã¢ã¿ããããŸãã 'popstate'ããã³ 'hashchange'ã€ãã³ãã«åºã¥ãã€ãã³ãã®é 管ã®çµæãšããŠãå€æŽã延æããäœããããããã§ãã
ãããã圹ã«ç«ãŠã°å¹žãã§ãã
state.goã䜿çšãã代ããã«window.location.hrefã䜿çšããŠãããä»ã®ãšããæ©èœããŠããããã§ãã ãã®ãŒãå°ãªãã
location.hashã®å€ã¯ãrunloopã®ã¹ãã³åŸã«æ£ãããªããŸãã Angularã¯ãlocation.hashãsetTimeoutïŒ...ã0ïŒã§ååŸããã®ãé ãããããšã§ããã®åé¡ãç°¡åã«åé¿ã§ããŸãã ããã¯angular.js / src / ng /location.jsãžã®æ倧2ã€ã®å€æŽã«ãªããšæããŸãã
@hober次ã®ãããªè§åºŠã§ã¿ã€ã ã¢ãŠããè©ŠããŸããïŒ
// 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();
});
ãããŠ
// 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
});
ããã§ãsetBrowserUrlWithFallbackã¡ãœããã®åšãã«setTimoutãè¿œå ããŸããããåé¡ã¯è§£æ±ºããŸããã
ããã¯ãAngularã«äŸåããªãçž®å°ããããã¹ãã±ãŒã¹ã§ãããåé¿çã瀺ããŠããŸãã Angularã§å®éã«åé¿çãå®è£ ããæ¹æ³ã¯ç§ã«ã¯ããããŸããã https://gist.github.com/hober/a29b6c28ac1744c800dd
ããã«ã€ããŠããå°ã詳ãã説æããŸãã å Žæã«é¢ããŠAngularã«å€æŽãå ããŸããã
ããã©ãŠã¶ã®æŽæ°ãã®éšåã§ã$ rootScopeã$ evalAsyncã$ rootScopeã$ applyAsyncã«å€æŽããŸããã
2ã€ã®æ¹æ³ã¯ãŸã£ããåãããšãããŠããããã«èŠããŸãã å®éã®$ digestã®å®è¡ã確èªãããŸã§ãéãã¯æããã«ãªããŸããã AngularJSããã€ãžã§ã¹ããå®è¡ãããšãã¹ã³ãŒãããªãŒããŠã©ãŒã¯ããããŒãã£ããŒã¿ãçæãããªããªããŸã§$ watchïŒïŒãã€ã³ãã£ã³ã°ãå®è¡ããŸãã ãã®ã©ã€ããµã€ã¯ã«äžã«ã$ applyAsyncïŒïŒãã¥ãŒãš$ evalAsyncïŒïŒãã¥ãŒã®äž¡æ¹ããã©ãã·ã¥ãããŸãã ããããããã¯2ã€ã®éåžžã«ç°ãªãå Žæã§çºçããŸãã
$ applyAsyncïŒïŒãã¥ãŒã¯ãAngularJSãããŒãã£ããŒã¿ã®ãã§ãã¯ãéå§ããåã«ã$ digestã®å é ã§ã®ã¿ãã©ãã·ã¥ãããŸãã ãã®ããã$ applyAsyncïŒïŒãã¥ãŒã¯ãæ倧ã§$ digestäžã«1åãã©ãã·ã¥ããã$ digestãéå§ãããåã«ãã¥ãŒã«æ¢ã«ããŒã¿ãå ¥åãããŠããå Žåã«ã®ã¿ãã©ãã·ã¥ãããŸãã
äžæ¹ã$ evalAsyncïŒïŒãã¥ãŒã¯ã$ digestå ã®ãããŒãã£ãã§ãã¯ããå®è£ ããwhileã«ãŒãã®å é ã§ãã©ãã·ã¥ãããŸãã ããã¯ããã€ãžã§ã¹ãäžã«$ evalAsyncïŒïŒãã¥ãŒã«è¿œå ãããåŒã¯ãåããã€ãžã§ã¹ãå ã®åŸã®æç¹ã§å®è¡ãããããšãæå³ããŸãã
ãã®éããããå ·äœçã«ããããã«ã$ watchïŒïŒãã€ã³ãã£ã³ã°å ãã$ evalAsyncïŒïŒã«ãã£ãŠè¿œå ãããéåæåŒãåããã€ãžã§ã¹ãã§å®è¡ãããããšãæå³ããŸãã $ watchïŒïŒãã€ã³ãã£ã³ã°å ãã$ applyAsyncïŒïŒã«ãã£ãŠè¿œå ãããéåæåŒã¯ãåŸã®æç¹ïŒã10msïŒã§å®è¡ãããŸãã
ããããã§ã«ããªãã®äœäººããå©ããŠãããããšãé¡ã£ãŠããŸã:-)ã
// 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
});
å¥ã®ã¢ãããŒãããããŸãã ç§ã¯Angularã³ãŒãããŒã¹ã«ããã»ã©ç²ŸéããŠããŸããããããžãã¯ã¯åççãªããã§ãã ãã©ãŠã¶ã®urlïŒ...ïŒé¢æ°ã¯çŸåšãæ£ããURLãããã«è¿ãlocation.hrefã«äŸåããŠããŸãã ãã®ã¡ãœããã¯åãå®è¡ã«ãŒãã§åŒã³åºãããããã$ digestå®å®åãµã€ã¯ã«å ã§ãåŒãç¶ãå€ãURLãååŸããŸãã ãã®ãããã¯ããpendingHrefããå©çšããŠå²ãåœãŠã远跡ããèšå®ãããŠããå Žåã¯ä»£ããã«ãã®å€ãè¿ããŸãã å€ãlocation.hrefãšæŽåãããšãä¿çäžã®å€ãã¯ãªã¢ãããŸãã URLã®èšå®äžã«ãurlïŒïŒgetãåŒã³åºãããªãå Žåããã£ããããããã«ã¿ã€ããŒã0msã«èšå®ãããŸãã å®ç§ã§ã¯ãããŸããããããžãã¯ã¯æ©èœããŠããããã§ãã ããã¯äž»ã«ãããã©ãŒãã³ã¹ã®é 延ãåŒãèµ·ãããªã代æ¿ã¢ãããŒããæ€èšããããšã§ãã ããã¯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;
}
};
解決çãããããšã@CleverCoder ïŒ ãã£ãŒã ã®ããã«æ©èœããããã§ãïŒ ïŒ+1ïŒ
@CleverCoder
ããã䜿çšããŠAngularããŒã ã«ãã«ãªã¯ãšã¹ããå®è¡ãããšããã§ãããã
@viattikãã°ã¯UIWebViewïŒAppleïŒèªäœã«ããã®ã§ãAngularããŒã ãiOS9äžã®UIWebViewã®åé¿çãæ¡çšããã®ã§ããã°ãç§ã¯ã¡ãã£ãšé©ããŸãã ããããããªãã¯ãã€ã§ãè©Šãããšãã§ããŸã...
@ raftheunis87
ããŸããŸãªãã©ãŠã¶ã«å€ãã®ãã°ããããAngularã³ãŒãã®ãããã®ãã°ã«å¯Ÿããå€ãã®åé¿çããããŸãã
ãããã¯å
¬åŒã«ã¯UIWebViewããµããŒãããŠããŸããããå€ãã®ãã€ããªããã¢ããªãå£ããAppleããã®ãã°ãä¿®æ£ãããŸã§ãææ°ã®iOSã®ãã€ããªããã¢ããªã§Angularã䜿çšããããšã¯äžå¯èœã«ãªããŸãã ãããŠãããã¯ç§ãèšãã ããããªã倧ããªåé¡ã§ãã
ã ããç§ã¯ãããè©ŠããŠã¿ãŸãã
@viattikç§ã¯å®å šã«åæããŸãã ãããŠãšããã§ïŒAppleã¯ãUIWebViewã®ãã°ãä¿®æ£ããå¯èœæ§ã¯äœããšç§ãã¡ã«äŒããŸããã ã ãã確ãã«ïŒãããè©ŠããŠã¿ãŠãã ãã;-)
çããããããWebkitã®ãã°ãšããŠæçš¿ã§ããã°ãçæ³çã«ã¯åçŸã±ãŒã¹ã䜿çšããŠãWebKitåŽã®é£çµ¡å ã®ããã€ãããã©ããŒã¢ããããŸãã https://bugs.webkit.org/
@naomiblack
Webkitã®ãã°ãã©ããã¯ããããŸããã iOS9ã®UIWebViewã§ã®ã¿çºçããããã§ãã iOS9ã®Safariã¯æ£åžžã«åäœããŸãã
@ raftheunis87ã³ãŒãã®ææ¡ã«æè¬ããå®ç§ã«æ©èœããŸãã
@ raftheunis87 @CleverCoderã¯ãã€ãªã³è§åºŠãæäœããæ¹æ³ã§ããïŒ ãã£ãšå ·äœçã«ã§ããŸããïŒ
@abrahamrkjç§ã¯ã€ãªã³ã®çµéšããããŸããã ããããã€ãªã³ã䜿çšããå Žåãè§åºŠã®ã«ã¹ã¿ãã€ãºã¯ãããŸããïŒ ããã§ãªããã°ãåãä¿®æ£ãã€ãªã³è§åºŠã§æ©èœãããšæããŸã...
@ raftheunis87https ïŒ//github.com/driftyco/ionic/tree/master/jsããã¯åœŒãã䜿çšããŠããè§åºŠã§ãã
ãã«ãªã¯ãšã¹ãã®@ CleverCoder + 1ã @viattikã¯ãå€ãã®ãã€ããªããã¢ããªãå£ããŠããŸãããããããéèŠãªåé¡ã§ããããšã«åæããŸãã
ãã«ãªã¯ãšã¹ãã¯è¿ãå°æ¥ã«è¡ãããå¯èœæ§ããããŸãããç§ã¯ä»ã®ã³ãŒãããŒã¹ã»ã©Angularã³ãŒãããŒã¹ã«è¿ããªããããèºèºããŠããŸãã ç§ã¯ããã«è§£æ±ºçãåæ€èšãããããé²åŒŸã«ããããã«åªããŸãã window.locationãªããžã§ã¯ãã®ããããã£ããããã«ãå€æŽãããªãã®ã¯å¥åŠã«æããŸãã ç§ãè¡ã£ããã¹ãã§ã¯ããpopstateãããã³ãhashchangeãã€ãã³ãããã¯ãé
眮ãããŠããªãéããå€æŽãä¿æãããŠããããšã«æ°ä»ãã延æãããå€æŽã®åå ã¯å®éã«äœããããŠããã®ã§ã¯ãªãããšæããŸãããããã§ãªããã°..ãããããããã®ã€ãã³ãã®ã¿ã€ãã³ã°ãå€ãã£ãïŒç§ã¯ããã芳å¯ããŠãããšæãïŒã
ããããæ°æ¥ãããŠãããèŠãŠãããŸãããã以äžè¯ãããšããªãå Žåã¯ãããå°ãæ·±ãæãäžããŠããããŸã§ã«ç¥ã£ãŠããããšãšãè¡åã®å€åã«å¯ŸåŠããã®ã«æé©ãªå Žæããªãããšã確èªããŸãã ãããçŽããããå Žåã¯ç³ãèš³ãããŸããã ãããã®ã€ãã³ãã«é¢ããŠç§ããŸã å®å
šã«ç解ããŠããªãå
éšã§èµ·ãã£ãŠããããšããããããããŸãã
也æ¯ïŒ
...ãããŠã¯ãã @ borrull ãç§ã¯åæããŸãã Appleããã以äžå€æŽãå ããªãå Žåãããã¯æ·±å»ãªæéç匟ã§ãããå®éã«æªããã¬ã¹ãæå·®ãã«ã€ãªãããŸãã ç§ã¯åé¿çãšããŠã¿ã€ããŒã®ãã¡ã³ã§ã¯ãããŸãããïŒãããã®çµã¿èŸŒã¿ããããã£ã®åšãã®ããžãã¯ãããŒãæ¹åãããã®ã§ããïŒãäžåºŠèšå®ãããå€ã®å€æŽã«äŸåã§ããªãå Žåã¯ãã©ãã«æç»ããŸããã©ã€ã³ïŒ ä»ã«ä¿¡é Œã§ããªãããããã£ã¯ãããŸããïŒ ããã¯å¥åŠãªãã®ã§ãã
@CleverCoderãã æè¬ãèšãããã£ãã ãã§ããããªãã®ãããã¯æ¬åœã«ãã®æ¥ãæããŸããïŒ
@CleverCoderäžããããåé¿çãããããšãã
ç§ã¯ãAngularãããã³ã¬ãŒã¿æ©èœã䜿çšããAngularãœãŒã¹ã«ããããé©çšããã«æäŸããããœãªã¥ãŒã·ã§ã³ãå°ãåºããŸããã
cssuaã䜿çšãããšããã®ã»ããã¢ãããç¹å®ã®ç°å¢ã§ã®ã¿äœ¿çšããããã«æ§æã§ããŸãã
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 ïŒ
@ jd-carrollïŒããã¯æ¬åœã«é¢çœãã§ãã å°ãé ããŠãæéããããšãã«ãããå蚪ãããããããŸããã ããªãç©ã§ãã£ã±ãã§ãã ããã¯ãå Žæã®é 延ãåŒãèµ·ãããŠã¯ãªããªãå¥ã®åé¡ã®ããã«æããããããããå€ãã®è¬ãçã¿åºããŸãã*å€ã®æŽæ°ã
@realityfilter ïŒãã³ã¬ãŒã¿ã«ã€ããŠãããããšæããŸã... Angularãã³ã¬ãŒã¿æ©èœã䜿çšããŠäœããå®è£ ãçµãããšããã§ãã ãããïŒ
ããã¿ããªã
ãã®ä¿®æ£ã«ãããä¿®æ£ãç°¡åãªãã°ãã³ãŒãã«å°å
¥ãããããšãè¿œå ãããã£ãã ãã§ãã
ãã³ãã¬ãŒãã«ã¯ãhref = "ïŒ"ãšng-click = "someCallïŒïŒ"ã䜿çšããã¢ã³ã«ãŒã¿ã°ããããŸããã hrefã¯ããã®ä¿®æ£ã䜿çšããŠãµã€ããindex.htmlã«ç§»åãããŠããŸããã hrefãåé€ãããšãåé¡ãä¿®æ£ãããŸããã
ç§ãã¡ã®ã¢ããªã¯ãIonicã®æ»ããã¿ã³ã®ããã²ãŒã·ã§ã³äžã«å£ããŠããŸããæåã«æ°ãããã¥ãŒã«ç§»åãã次ã«éšåçã«å€ããã¥ãŒã«æ»ãã次ã«IOS9ããŒã¿ã®æ°ãããã¥ãŒã«åã³ç§»åããŸããIonicã®è§£å床
iOS9ããŒã¿513A4325cãAngular 1.4.0ïŒcordova-ios 3.9.1ã䜿çšïŒã§ãåãåé¡ãçºçããŸãã ããŸãããã°ãæ ¹æ¬çãªUIWebViewã®ãã°ãä¿®æ£ãããã§ãããïŒ
Angularv1.2.27ã§ãåãåé¡ãçºçããŠããŸã
ç§ã¯ããã1.2.27ãªãªãŒã¹ãŸã§ããã®ãŒããŸãããããã°ã¯ä»¥åã®1.2.26ãªãªãŒã¹ã«ã¯ãããŸããã
å ·äœçã«ã¯ããã®ã³ããããåå ã§ãã
@damrbabyç§ã¯ãããšäœãé¢ä¿ãããããã§ãã
ããããMobile Safariã§ææ°ããŒãžã§ã³ã®angularã§åäœããŠãããšããäºå®ã¯ãiOS 9ã®uiWebViewã§äœããããªããã°ãªããªãããšãæããã«ããŠããŸãããããã£ãŠãAngularãœãŒã¹ã³ãŒãã§è¡ã£ãå€æŽã¯å¿ ãããæªãããšã§ã¯ãããŸããã
@CleverCoder @realityfilter @ jyc66ããããšããšèšãããã£ãã®ã§ãããããªãã¯ç§ã®äžæ¥ãæã£ãŠãããŸããã
iOS9 GMã·ãŒãã«ã¯ãŸã åé¡ããããŸãã®ã§ãã¢ããªãææ°ã®ç¶æ ã«ããŠãã ããïŒ
ãã®åé¡ã¯iOS9GMïŒ13A340ïŒã«ããŸã ååšããŠããããšã確èªã§ããŸã
ã€ãŸããããã¯Appleãäœããå£ããããšãæå³ããã¢ããªãã¯ã©ãã·ã¥ããªãããã«ãã¢ããªãå床æŽæ°ããå¿ èŠããããŸãïŒãã®ãã¡ã®ããã€ãã¯ãæ°ãæãŸãã¯1幎以äžå€æŽãããŠããŸããïŒã çã«ããªã£ãŠããŸã:(ãç§ã¯ãããAppleã«iOS9ã®ããŒã³ãã®ããã«ãããä¿®æ£ããŠããããããå€ãã¢ããªã§ææ°ã®AngularããŒãžã§ã³ã«è¡ãããšã¯ä»ã®ããã€ãã®ãã®ãå£ããŠããŸãã ããã
iOS9ã§åé¡ãçºçããŠãããã¬ãŒã ã¯ãŒã¯ã¯Angularã ãã ãšæããŸããïŒ
ãã®ãããIonicããŒã ã®@ adamdbradley ã @ perrygovier ãããã³@mhartingtonã¯ãIonicããã³ãã¬ãŒã³ãªAngularã¢ããªã§ãæ©èœããä¿®æ£ã«äžæ¥äžåãçµãã§ããŸãã ç®æšã¯ãAngularã®å€æŽãå¿ èŠãšããªãããããã€ã³ä¿®æ£ã§ãããïŒããŸãããã°ïŒã»ãšãã©ã®1.2以éã®AngularããŒãžã§ã³ã§æ©èœããŸãã
ããã¯ããã®ããããé©çšããããšã§$browser
ãè£
食ããã³ä¿®æ£ããçŸåšã®ãã³ãã«ãœãªã¥ãŒã·ã§ã³ã§ãã 泚ïŒããã¯Angular 1.4.3ã«åºã¥ããŠãããAngularæ¬äœã®browser.js
ãä¿®æ£ä»ãã¯ããŒã³ãã®ãããªãã®ã§ãïŒ https ïŒ
ãŸããCDNã«ããããé 眮ããŸããã CDNãã¡ã€ã«ãæ¬çªç°å¢ã«äœ¿çšããããšã¯ãå§ãããŸãããCDNãã¡ã€ã«ã¯ããã«ããã ããªã®ã§ãä»ãããã¹ãããæ¹ãç°¡åã§ãã
ãã¹ãããã«ã¯ã次ã®ã¹ã¯ãªããã¿ã°ãangularãŸãã¯ionic.bundle.jsãã¡ã€ã«ã®äžã«é 眮ããŸãã
<script src="https://code.ionicframework.com/patch/ios9-$browser-patch.js"></script>
ãŸããçŸåšãiOS9ã§å®è¡ããŠãããã©ããã«é¢ä¿ãªããããããé©çšãããŸãã ããã¯ãŸããªãä¿®æ£ãããiOS 9UIWebViewã§ã®ã¿å®è¡ãããããã«ãªããŸãã
ããã§å¯Ÿå¿ããIonicã®åé¡ã«åŸã£ãŠãã ããïŒ https ïŒ
ããã«ã¡ã¯ãã¿ããªã
UI-srefã¯é
åã®ããã«æ©èœããŸããã$ state.goã¯æ»ããã¿ã³ã®ã¢ãã¡ãŒã·ã§ã³ãå£ããŸã
ãã®ä¿®æ£ãé©çšããåŸã§ããããŒãžã倧ããã¡ãã€ããŸãã
ããããã
ã¢ãžã£ã€ã·ã³
6:23ã®æšã2015幎9æ10æ¥ã«ã¯ãæ倧ãªã³ã[email protected]ã¯æžããŸããïŒ
ãããã£ãŠã @ adamdbradley https://github.com/adamdbradleyã@ perrygovier
https://github.com/perrygovier ãããã³@mhartington
IonicããŒã ã®https://github.com/mhartingtonãæ©èœããŠããŸã
Ionicããã³ãã¬ãŒã³ãªAngularã¢ããªã§æ©èœããä¿®æ£ã1æ¥äž
äžæã ç®æšã¯ãå€æŽãå¿ èŠãšããªãããããã€ã³ä¿®æ£ã«ãªãããšã§ã
Angularã§ãããïŒããŸãããã°ïŒã»ãšãã©ã®1.2以éã®AngularããŒãžã§ã³ã§æ©èœããŸããããã¯ã$ browserãè£ é£Ÿããã³ä¿®æ£ããçŸåšã®ãã³ãã«ãœãªã¥ãŒã·ã§ã³ã§ãã
ãã®ããããé©çšãã
https://github.com/angular/angular.js/issues/12241#issuecomment-130744518 ã
泚ïŒããã¯Angular 1.4.3ã«åºã¥ããŠããã
Angularæ¬äœã®browser.jsïŒ
https://github.com/driftyco/ionic/blob/ios9-patch/js/angular/service/decorators/ios9-browser-fix.jsãŸããCDNã«ããããé 眮ããŸããã CDNãã¡ã€ã«ã®äœ¿çšã¯ãå§ãããŸãã
æ¬çªç°å¢ã§ã¯ãããã«ããååšããªããããä»ãããã¹ãããæ¹ãç°¡åã§ããããããã¹ãããŠãã©ããªããæããŠãã ãããããããšãã
ãã¹ãããã«ã¯ããã®ã¹ã¯ãªããã¿ã°ãAngularãŸãã¯
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
.
ãã®ãã°ãiOS9.1 Beta1ã«ãŸã ååšããããšã確èªã§ããŸã
$state.go
é »ç¹ã«äœ¿çšããŸãããç¶æ
éã§ã¡ãã€ãããããæ£ããé·ç§»ããŠããŸããã
ç³ãèš³ãããŸããããä¿®æ£ã¯ã¢ããªã§æ©èœããŸããhttpsãå«ããå¿
èŠãããã ãã§ãã
http CDNã®ä»£ããã«CNDãªã³ã¯ã¯ãios9ãå
éšã®httpsã®ã¿ãèš±å¯ããŠããããã«èŠããŸã
ã¢ããªãªã®ã§ãhttpsã䜿çšããåŸãç§ãã¡ã®ã¢ããªã¯åäœããŸããã
https://code.ionicframework.com/patch/ios9- $ browser-patch.js
15:22ã®æšã2015幎9æ10æ¥ã«ã¯ãã¿ã€ã©ãŒCrammond notifications@github.com
æžããŸããïŒ
$ state.goãé »ç¹ã«äœ¿çšããŸãããå·éã§ã¡ãã€ãããããŸã/ããã§ã¯ãããŸãã
æ£ãã移è¡ããŸããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/angular/angular.js/issues/12241#issuecomment -139189216
ã
ios9- $ browser-patch.jsãç§ã®ããã«åããŸãã ããããããã¯ããã€ãã®jshintãšã©ãŒãçæããŸãã ãšã©ãŒãåãé€ãã®ã«åœ¹ç«ã€ãããã«è²¢ç®ããæ¹æ³ã¯ãããŸããïŒ
Angularã®å€éšããå ŽæãæŽæ°ã§ããªãããããã®ããããå®å šã«é©åã§ãããšã¯æããŸããã ããã¯ããããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠåé¡ã§ã¯ãããŸããããããè¯ã解決çããããã©ããã確èªããããã«åãçµãã§ããŸã...
ios9- $ browser-patch.jsãæ©èœããŸããã§ããã ãªã¹ããã¥ãŒãã詳现ãã¥ãŒã«ç§»åãããšãã¯ã$ state.goïŒïŒã䜿çšããŠããŒãžéã移åããŸãã åããŠãããè¡ããšãã¹ã©ã€ãããŠãŸã£ããã«æ»ããããäžåºŠã¯ãªãã¯ãããšæ©èœããŸãã UI-srefã¯åžæã©ããã«æ©èœããŸãããå¿ èŠãªæ¡ä»¶ä»ãããžãã¯ãå®è¡ã§ããŸããã
æ®å¿µãªãããããããããŠã³ããŒãããä¿åããŠ./lib/ããããŒãããŸããïŒããŒããããŠããããšã確èªããŸããïŒããäœãå€æŽãããŸããã§ããã
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ãã€ãªã³1.0.0ã
Joriswãios9æ€åºã³ãŒããç¡å¹ã«ããŠã¿ãŠããããæ©èœãããã©ããã確èªããŠãã ããã
var isIOS9 =ïŒnavigator.userAgent.indexOfïŒ 'Version / 9ã'ïŒïŒ= -1ïŒ&&ïŒnavigator.appVersion.indexOfïŒ '9_0'ïŒïŒ= -1ïŒ;
ifïŒïŒisIOS9ïŒ{
// iOS9UIWebViewã§ãªãå Žåã¯ããããé©çšããªã
$ browserãè¿ããŸãã
}
@ jyc66ããŸããããŸãããããããšãã iOS <9ãå£ããªãããã«ããã«ã¯ã©ãããã°ããã§ããïŒ
isIOS9
ã¡ãœããã«åé¡ããããŸãã 以äžããã§ãã¯ããå¿
èŠããããŸãã
> 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
ããããããã¯ã9æªæºã®OSããã¹ãããŠããã®ãããªå Žåã¯ä¿®æ£ãç¡å¹ã«ããããšãã§ããŸãã çŸåšã®ãã§ãã¯ã¯ãéããªããªãªãŒã¹ãããiOS9.1ã§ãæ©èœããªããªããŸãã
ç§ãŸãã¯èª°ããããè¯ããã®ãæãä»ããŸã§ãç§ã¯ä»ããããã£ãŠããŸãïŒ
// 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;
}
ãããããã¯ç§ãããŠããããšã«äŒŒãŠããŸãã
ããããiOSããŒãžã§ã³> = 9.0ã«é©çšãããšãAppleãiOSã®ä»åŸã®ãªãªãŒã¹ã§åé¡ãä¿®æ£ããå Žåã«åé¡ãçºçãããã©ããã誰ãç¥ã£ãŠããŸããïŒ
@JeremyPleaseç§ã¯ä»9.1ããŒã¿ãããŒãããŠããŸãããããŠããããã§ãã¯ããŸã
çž®å°ããããã³ãã«ã®äžéšãšããŠããããæäŸãããŠãŒã¶ãŒãšãŒãžã§ã³ããã§ãã¯ãç¡å¹ã«ãããšãã«ç§ã®ããã«åããã ããã¯éã€ãªã³æ§ã®è§åºŠã®ããã¢ããªã§ãã ä»å€ããã«èª¿æ»ãããã¹ãŠãæåŸ ã©ããã«æ©èœããããšã確èªããŸãã
åªåããŠãããã€ãªã³ããŒã ã«æè¬ããŸãïŒ
ãããã£ãŠã9.1beta1ã«ã¯ãŸã ä¿®æ£ããããŸããã é©ãããšã§ã¯ãããŸããã
ããã¯å¥åŠã«æãããããããŸããããiOS 9ã«ããããé©çšãããšãã«String.splitïŒïŒé¢æ°ãæ£ããæ©èœããªãã®ãèŠã人ã¯ããhttps ïŒ
å°æããŸããïŒ ãã¡ãããiOS8.4ãšChromeã§ãåé¡ãªãåäœããŸãã
æŽæ°ïŒString.splitã¯ãç§ã«ãšã£ãŠiOS 9 iPhone 6ããã³6sã·ãã¥ã¬ãŒã¿ãŒã§ã¯æ©èœããªãããã§ãããããšã¯äœã®é¢ä¿ããããŸããã
ã¡ãªã¿ã«ããŠãŒã¶ãŒãšãŒãžã§ã³ãã®ãã§ãã¯ã«äœ¿çšãããã®ã¯æ¬¡ã®ãšããã§ãã
var isIOS9WebView = (navigator.userAgent.indexOf('Safari') === -1) && (navigator.appVersion.indexOf('OS 9') !== -1);
if (!isIOS9WebView) {
// do not patch if not iOS9 UIWebView
return $browser;
}
ããããIgorã®ãã«ãªã¯ãšã¹ããæåã®è§£æ±ºçã ãšæããŸãããããã¯iOS 9 Safariã«ããããé©çšãããUIWebViewã«ã®ã¿é©çšããå Žåã«æ©èœããŸãã
@ dac09ã³ã¡ããããã¹ããããã®ã§ãããã©ã®ãã¡ã€ã«ãå€æŽããå¿
èŠãããã®ãââããããŸãã...
ã©ã®ãã¡ã€ã«ãå€æŽããå¿
èŠããããæããŠããããŸããïŒ
ç§ã¯@CleverCoderã®ãããã䜿çšããŠã
ããã«ã¡ã¯çããããã®ãããããã¹ãããŠããã ããŸããïŒ https ïŒ
Angular 1.2 â 1.4.5ã§åäœããã¯ãã§ãããAngularã®æŽæ°ã¯å¿ èŠãããŸããã ãããã¢ããªã«é©çšããæ¹æ³ã®èª¬æã¯èŠç¹ã§ãã
1.4.6ã§é©åãªä¿®æ£ãè¡ãäºå®ã§ããããããŸã§ã®éããã®ã¹ã¿ã³ãã¢ãã³ãããã¯ãä¿®æ£ã®å®è£ ãšå±éã容æã«ããŠãè¿ éã«å±éã§ããããã«ããããšãç®çãšããŠããŸãã
ããã«ã¡ã¯@ IgorMinar -
Uncaught TypeErrorïŒangular.moduleïŒ...ïŒãdecorator is not a functionïŒanonymous functionïŒ@ angle-ios9-uiwebview.patch.jsïŒ33
@rajatrocksããŒã..è¯ãç¹ã module.decoratorã¯1.4æ©èœã®ã¿ã§ãã ããããå€æŽãããŠãã ããã
@rajatrocksç§ã¯æŽæ°èŠæšã
@IgorMinarã«æè¬ãåé¡ãªããã€ã³ã¹ããŒã«ãããŸãã Ionicã¹ã¬ããã¯ããã«é¢é£ããŠããã®ã§ãã³ã¡ã³ããæ®ããŠãããŸãã
@IgorMinar jsãã¡ã€ã«ãå«ãã
@IgorMinarããªãã®ãããã¯ç§ã®åé¡ãä¿®æ£ããŸããã§ãããã @ mlynchããã®ãã®ã¯
iOSãã©ãããã©ãŒã ã«ã®ã¿é©çšãããããã«ããããã«ãåçŽãªCordovaããã¯ãäœæããŸããã
https://gist.github.com/DURK/f2acd6bca4759e719801
æŽæ°ïŒããããããã«ãã§ãã¯ãå«ãŸããŠããã®ã§ãiOS9ã«ã®ã¿é©çšãããŸãã
@IgorMinar @DURKãš@jprangenbergã®å ±åããã©ããŒã¢ãããããšãiPad Air 2ã§ãã¹ããããšãã«ããisIOS9UIWebViewãé¢æ°ã«åé¡ãããããã§ããã·ã ãåžžã«é©çšããããã«åŒ·å¶ãããšãããããæ©èœããŸãã
ç§ã®ã³ã¡ã³ãããïŒ https ïŒ
@IgorMinar ããããã¯iOS 9 iPhone UIWebViewã§ããŸãæ©èœããŸãããiPadã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãæ€åºã«ã¯ããã€ãã®åé¡ããããŸãã
UIWebViewã®iOS9 iPhoneãŠãŒã¶ãŒãšãŒãžã§ã³ãïŒ
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340
UIWebViewã®iOS9 iPadãŠãŒã¶ãŒãšãŒãžã§ã³ãïŒ
Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340
ããããã¹ãŠã«ç¢ºå®ã«äžèŽããæ£èŠè¡šçŸã¯æ¬¡ã®ãšããã§ãã
function isIOS9UIWebView(userAgent) {
return /(iPhone|iPad|iPod);.*OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
}
@IgorMinarã®èŠç¹ããã©ãŒã¯ããããã§å€æŽãå ããŸããïŒ https ïŒ //gist.github.com/JeremyPlease/72cb3bf98279fefed4e3
@DURKã³ã«ããããã¯ã¯å¿ èŠãããŸããã ãããã¯ããããå¿ èŠãšããªããã©ãããã©ãŒã ã§ã¯äœãããŸããã
@ JeremyPleaseiOS9ã®Safariã¯åœ±é¿ãåããŸããã UIWebViewã«ãããšãã ãããããé©çšãããã®ã§ãã
@JeremyPlease Safari iOS 9ã¯åé¡ã§ã¯ãªãã®ã§ã @ IgorMinarã®ãã§ãã¯ã¯æ£ããã§ã-ç¹ã«UIWebViewsã«éå®ãããšæããŸãã
ç§ã«ãšã£ãŠã¯çŽ æŽãããäœåã§ãã
ããã¯UIWebViewã®åé¡ã«ãããªãããšã«æ°ä»ããã®ã§ãSafariã§ã¯é©çšãããªãããã«èŠç¹ãæŽæ°ããŸããã
function isIOS9UIWebView(userAgent) {
return /(iPhone|iPad|iPod);.*OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
}
ãããã®v1.0.3ãå ¬éããŸãã
@IgorMinar ngRouteã䜿çšããŠããå Žåããã®ä¿®æ£ã¯
@jprangenbergã¯ãã ngrouteã䜿çšããç§ã®ã¢ããªã¯iphone / ipadã§æ£åžžã«åäœããŸãã 詳现ãæããŠããã ããŸããïŒ ãŸãããããã®v1.0.3 +ã䜿çšããŠããããšã確èªããŠãã ãã
@IgorMinarããŒãžã§ã³1.0.3ã®ãããã¯ç§ã®ç°å¢ã§æ£ããæ©èœããŠããŸãã
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ïŒã«ãŒãïŒïŒ
$stateProvider.state('app.regions', {
cache: false,
url: "/states/:state_id/regions",
views: {
'menuContent': {
templateUrl: "templates/regions.html",
controller: 'RegionsCtrl'
}
}
})
ã¢ããªå ã移åããããšã¯ã§ããŸããã ãªã¹ãã¢ã€ãã ãã¯ãªãã¯ãããšãçŸåšã®ãã¥ãŒã衚瀺ãããŸãã å±¥æŽãã¿ã³ãå€ãããŸãã å±¥æŽãã¿ã³ãã¯ãªãã¯ãããšããªã¹ãã¢ã€ãã ã®ã¯ãªãã¯ãã¥ãŒã衚瀺ãããŸãã
<ion-list>
<ion-item ng-repeat="state in states" href="#/app/states/{{state.id}}/regions">
{{state.name}}
</ion-item>
</ion-list>
@IgorMinarããã¯ç§ã«ã¯ããŸã
@jprangenbergã¯ãããããé©çšããããŒãžã§ã³ã®Ionicãã³ãã«ãŸãã¯ãªãªãŒã¹ã䜿çšããŠããŸããïŒ
@ perrygovier @ IgorMinarã®ããŒãžã§ã³1.0.3ã䜿çšããŠããŸã
@jprangenbergã¯æ£ããã§ãããionic.bundle.jsã§ãã ããã¯äœã®ããŒãžã§ã³ã§ããïŒ
ç§ã®ionic.bundle.jsã®ããŒãžã§ã³ïŒ
window.ionic.version = '1.0.0';
@perrygovierå©ããŠãããŠããããšãïŒ
奜å¥å¿ããããã³ãã«ã®1.1.0ããŒãžã§ã³ã䜿çšããããšã¯åœ¹ã«ç«ã¡ãŸããïŒ
http://code.ionicframework.com/1.1.0/js/ionic.bundle.min.js
ããããæŽæ°ãããCSSãå¿
èŠã«ãªãã§ããã
http://code.ionicframework.com/1.1.0/css/ionic.min.css
ãã@jprangenberg ãç§ãã¡å šå¡ãäžç·ã«ããã«åãçµãã§ããéãç§ãã¡ã¯éåžžã®è§åºŠã®ãããŠãŒã¶ãŒãã¹ãã ããªãããã«ãã€ãªã³ã®åé¡ã«é¢ãããã®ã€ãªã³é¢é£ã®è°è«ãç¶ããŸãããdriftyco / ionicïŒ4082
ãããã£ãŠã httpsïŒ //github.com/Telerik-Verified-Plugins/WKWebViewã䜿çšããå Žåããã®ãã°ã¯WKWEBVIEWã«åœ±é¿ããŸãããïŒ
ãã°ã¯iOS9ã®UIWebViewã«ã®ã¿ãããŸãã WKWebViewã䜿çšããŠããå Žåã¯ååšããŸããã
ãã®äººãã¡ã®ä»äºã«æè¬ããŸãããæ®å¿µãªããç§ã«ã¯ããŸããããŸããã ã¢ãã¡ãŒã·ã§ã³ãå£ããããããŒãžããŸã£ããèªã¿èŸŒãŸããªãã£ãããããŒãžãæ£ããèªã¿èŸŒãŸããªãã£ããããŸããåºæ¬çã«ã«ãŒã¿ãŒãå®å šã«äžå®å®ã§ãã
ç§ã¯iPhone6ã§Ionicãã³ãã«1.1.0ãšiOS9.1ã䜿çšããŠãããããããã¡ã€ã«ã¯https://code.ionicframework.com/patch/ios9- $ browser-patch.jsã«ãããŸãã 次ã®ãããªãšã©ãŒã衚瀺ãããŸãã
ãšã©ãŒïŒ[$ rootScopeïŒinfdig ] 10åã®$ digestïŒïŒå埩ã«éããŸããã äžçµ¶ïŒ
ãŠã©ããã£ãŒã¯éå»5åã®å埩ã§è§£éãããŸããïŒ[]
å©èšããããŸããïŒ
ããããšãïŒ
@scottopolisã¯Igorã®ããããè©Šãhttps ïŒ //gist.github.com/IgorMinar/863acd413e3925bf282c
@petebacondarwin yaããããšããIgorã®ãããã¯ç§ã®ããã«åããŸãã ç§ã®ããŒãžé·ç§»ã¢ãã¡ãŒã·ã§ã³ã¯éåãéåãã§ãããã«ãŒã¿ãŒã¯ä¿®æ£ãããŠããããã§ãã ç§ã¯ãã®åé¡ã«ç®ãå ãããŠãããŸãã
ããã§ã®ããã€ãã®ãã¹ããš@IgorMinarããã®ãããã«ãããæ»ããã¿ã³ã®ã¢ãã¡ãŒã·ã§ã³ãšã³ã³ãããŒã©ãŒã§åé¡ãçºçããŠããŸãã æ»ããã¯ãªãã¯ãããšãåã³äœæãããªãããã«æ»ã£ãŠããç»é¢ã®ã³ã³ãããŒã©ãŒã衚瀺ãããŸãã ããã«ãããç»é¢ãã移åãããšãã«ãã®ãã¥ãŒã§ã¢ãã¡ãŒã·ã§ã³ãå®è¡ãããŸããããã¯ããããçš®é¡ã®å¥åŠãªããšã§ãã
ãããŸã§ã®ãšãããã€ãªã³ããæ¯æ©äœ¿çšããŠãåé¡ã¯ãããŸããããiOS9ã®æ€åºãæŽæ°ããŠããŸãã
var userAgent = navigator.userAgent,
isIOS9 = /(iPhone|iPad|iPod).* OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
ãããã®v1.1.0ãããã·ã¥ããŸããïŒ https ïŒ//gist.github.com/IgorMinar/863acd413e3925bf282c
ã€ãªã³ããŒã ãšååããŠããã®ããŒãžã§ã³ã®ãããã§ã¡ãã€ããåçŸããããšã¯ã§ããªããªããŸããã
ã¢ããã°ã¬ãŒãããŠãããã«åé¡ãçºçããå Žåã¯ãç¥ãããã ããã ïŒãŸãããããã®v1.1.0ã«å ããŠããã®åé¡ã«ä»ã®ãããã䜿çšããŠããªãããšã確èªããŠãã ããïŒã
æ¥é±ãã¹ã¿ãŒã«ä¿®æ£ãå ããäºå®ãªã®ã§ãAngularv1.4.6ã«ããããé©çšããå¿ èŠã¯ãããŸããã
ãã®æ°ããããŒãžã§ã³ã®ãããã¯ç§ã«ãšã£ãŠå®ç§ã«æ©èœããŠããŸãã ããããšã@IgorMinarïŒ
ãªãªãŒã¹ããã1.4.6ã¯ãã®åé¡ãå®å šã«ä¿®æ£ããŸããïŒ
@ alexislg2-ã¯ãããã®ãªãªãŒã¹ã§åé¡ãä¿®æ£ããããããããããé©çšããå¿ èŠã¯ãããŸããã
確èªæžã¿ãã·ãã¥ã¬ãŒã¿ãŒãšããã€ã¹ã§åäœããŸãããŠãŒã¶ãŒã¯Appleã®æ¿èªã2é±éåŸ ã€å¿ èŠããããŸã;-(
@dbroadhurst https://openradar.appspot.com/22186109ãã°ã¬ããŒããåŒçšããŠãã¢ããªã®æŽæ°ããã°ãã远跡ã§ããå¯èœæ§ããããšèããŸããã
ãã®WebKitã®ãã°ããã©ããŒããŠæŽæ°ã確èªã§ããŸãã
ããã«ã¡ã¯ãAngular.jsã®ããã·ã¥å€æŽã§ã®iOS9éåæåŒã³åºãã®åé¡ã解決ããããã§ãã
ç§ã¯èª¿æ»ãè¡ããstackoverflowã«ãæçš¿ããŸãããããããŸã§ã«èŠã€ããå¯äžã®è§£æ±ºçã¯ãAngularbrowser.jsãããã«ãããŸãã
ç§ã¯Angularã«ããŸã詳ãããªãã®ã§ãä¿®æ£ãå©çšã§ããããã«ããããšãç解ããããšæããŸãã
ããã·ã¥ã«ãŒãã£ã³ã°ã«åºã¥ããã¹ãŠã®Webã¢ããªã±ãŒã·ã§ã³
åé¡ãç¹å®ããŠä¿®æ£ããæ¹æ³ã説æããŠãã ããã
@ lchenneberg -AngularJSã®åé¡ãä¿®æ£ããã³ãããã¯ãã¡ãhttps://github.com/angular/angular.js/commit/8d39bd8abf423517b5bff70137c2a29e32bff76d
åé¡ã¯ããã®ç¹å®ã®ãã©ãŠã¶ãŒã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
2çªç®ã®console.log
ã¯ãæ°ããå€ã§ã¯ãªããå€ãå€ãè¿ãããšã«æ³šæããŠãã ããã çŸåšã®ã€ãã³ãã«ãŒããå®äºãããšã3çªç®ã®console.log
ããã«ãå€ãæŽæ°ãããŸãã
ç§ãã¡ãæãã€ããä¿®æ£ã¯ããã©ãŠã¶ãåæçã«æŽæ°ãããŠããªãå Žåãç§ãã¡ãæžããå€ããã£ãã·ã¥ãããã以éã window.location.href
ããè¿ãããå€ã®ä»£ããã«ããã®å€ã䜿çšããããšã§ãã hashchange
ã€ãã³ãããããŸããããã¯ããã©ãŠã¶ãæçµçã«èªåèªèº«ãæŽçããããšã瀺ããŠããŸãã
ã圹ã«ç«ãŠã°å¹žãã§ãã
@IgorMinarã®ãããã¯ç§ã«ãšã£ãŠããŸãæ©èœããŸããã 次ã®ããŒãžã§ã³ã®AngularïŒIonicã䜿çšããŠããŸãã
window.ionic.version "1.0.1"
angular.version
Object {full: "1.3.13", major: 1, minor: 3, dot: 13, codeName: "meticulous-riffleshuffle"}
@IgorMinarã®ããããç§ãã¡ã®ããã«åããã ããããšãïŒ
ããããç§ã¯ããªãã®äžäººãçããããšãã§ãããããããªãå¥ã®è³ªåããããŸãïŒ
ãŸãã¯ãããã«éèŠãªããšã«ããã®æ¹æ³ã§Webã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ãããšãNitroã¬ã³ããªã³ã°ãšã³ãžã³ãå©çšãããŸããïŒ
@tpeifferã¢ãã¬ã¹ããŒã®ãªããµãã¡ãªãªã®ã§ã
ããã«ã¡ã¯ãç§ã¯å€ãããŒãžã§ã³ã®Angularã§ãããšãŸã£ããåãåé¡ãæ±ããŠããŸãïŒ1.0.6
ãã¹ãŠã®ä¿®æ£ãæ°ããããŒãžã§ã³çšã§ããããšãããããŸããããã®åé¡ãä¿®æ£ã§ãããã©ããã確èªããããã«ã©ããæ¢ãã¹ããç¥ã£ãŠããŸããïŒ ããããšãã
@tzamora @IgorMinarã®ããããé©çšããŠã¿ãŸãããïŒ ããããã1.0.6ã¯æ©èœããã«ã¯ææå°æ©ã§ãã
@petebacondarwin @IgorMinarã®ãããã¯ãbrowser.jsãšãããã¡ã€ã«ãåç §ããŠããŸãã browser.jsãšãããã¡ã€ã«ã¯ãããŸãã
åèãŸã§ã«ãæ ¹æ¬çãªåé¡ã®ä¿®æ£ã¯å
æ¥WebKitã«äžéžããŸããïŒ
http://trac.webkit.org/changeset/190092
http://trac.webkit.org/changeset/190100
ç§ã¯ãããjsãããã§åäœãããŸããããããã«ã¯æ©èœããŸããã§ããã ããïŒangularjsãšIonicïŒã¯åããŠãªã®ã§ã誰ããããããã§ãã¯ããŠãã¡ãžã£ãŒãªãã®ãèŠéãããã©ãããç¥ãããŠãããããæ¬åœã«ãããããã§ãïŒ ïŒäŸãã°ããã©ãããã©ãŒã ãªããžã§ã¯ãã¯éåžžã«éå¹ççã§ããªã©ïŒ
泚æïŒ
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
}
ã·ãã¥ã¬ãŒã¿ãŒã®8.4ã§ãã®åé¡ã«ééããŸããã ãã®ãããiOS9ã ãã«éå®ãããŠãããšã¯æããŸããããšãŒãžã§ã³ãæååãã§ãã¯ãæŽæ°ããŠããŒãžã§ã³iOS8ããã³9ãå«ããŸãããããããšãŒãžã§ã³ãæååã§ãã
ãMozilla / 5.0ïŒiPhone; Mac OSXã®ãããªCPUiPhone OS 8_4ïŒAppleWebKit / 600.1.4ïŒGeckoã®ãããªKHTMLïŒMobile / 12H141ïŒ140307121489296ïŒã
+1
ããã«ã¡ã¯
ãããiOS9.2ã§è§£æ±ºããããã©ããã誰ãã確èªã§ããŸããïŒ ïŒããŒã¿ïŒ
ããããšã:)
ä»æãiPhone6ã§iOS9.2ïŒ13C75ïŒã«ã¢ããããŒãããæç¹ã§ããã®åé¡ãåçŸããããšã¯ã§ããŸããã ãã®ãã°ã¯ãŸã éããŠããŸã-httpsïŒ//openradar.appspot.com/22186109
ãã®ããããé©çšããå ŽåãiOS 9.2以éã«æªåœ±é¿ãäžããå¯èœæ§ã¯ãããŸããïŒ ç§ã¯ãããç§ãã¡èªèº«ã®ã¢ããªã§ãã¹ãããŸãããç§ãã¡ã®ç¹å®ã®ç¶æ³ããã¹ããããšãã«è¡šç€ºãããªãåé¡ãå°å ¥ããŠããªãããšã確èªããããšæããŸãã
ç§ãèŠãéãããã¹ãŠã®ãããã¯iOS 9以éããã£ã«ã¿ãªã³ã°ããæ£èŠè¡šçŸã䜿çšããŠããŸããã9.1ãŸã§ã®9.xã¯ç¹ã«äœ¿çšããŠããŸããã
ããã«ã¡ã¯ããã®åé¡ã¯çŸåšiOS9ãæèŒããiPhone6ã§çºçããŠããŸããçç±ãæããŠããããŸããïŒ
https://forum.ionicframework.com/t/ios-9-beta-slide-menu-app-transition-issue/30768
é©çšããå¿
èŠãããå¥ã®ãããã¯ãããŸããïŒ ç§ã«ç¥ãããŠãã ãããç§ã¯æ¬åœã«ãã®ç»é¢ã®ãªãŒããŒã©ããã®åé¡ãä¿®æ£ããå¿
èŠããããŸãã
iOS 9.2ã«ã¢ããããŒãããããšã§ãç§ãããã解決ã§ããããã§ãã
@ bruno-serfeããã¯ãiOSãiOS 9.0.xã«ã®ã¿ååšããwindow.location
ãåŠçããæ¹æ³ã«é¢ããåé¡ã§ãã Angular 1.4.6+ã«æŽæ°ã§ããå Žåããã®ããŒãžã§ã³ã«ã¯ä¿®æ£ãå«ãŸããŠãããããä»ã«äœãããå¿
èŠã¯ãããŸããã ã¢ããã°ã¬ãŒãã§ããªãå Žåã¯ã httpsïŒ //github.com/angular/angular.js/issues/12241#issuecomment-139446288ã®ãããã§åãä¿®æ£ãè¡ãããŸãã
åè¿°ã®ããã«ããã®åé¡ã¯iOS 9.1.0ã§ä¿®æ£ããããããiOS9.0.xã§ã®ã¿çºçããŸãã
ionicã«æçš¿ãããåé¡ã¯åãåé¡ã®ããã«èŠããã®ã§ãåãä¿®æ£ãäž¡æ¹ã®æ¹æ³ã§æ©èœããã¯ãã§ãã
@lgalfasoè¿ä¿¡ããããšãããããŸããèŠã€ãããã€ãžã§ã¹ããšã©ãŒãä¿®æ£ããããšããŸããããã§ãåé¡ã解決ããªãå Žåã¯ãAngularãã¢ããã°ã¬ãŒãããŠã¿ãŸããè¿ä¿¡ããããšãããããŸãã
ããããšã@lgalfaso ïŒ+1ïŒ
Webã¢ããªãããŒã ç»é¢ã«è¿œå ããŠã¹ã¿ã³ãã¢ãã³ãšããŠäœ¿çšãããšãã«ãã®åé¡ãçºçããŸããããAngularJS 1.4.5ãã1.5ã«ã¢ããã°ã¬ãŒããããšåé¡ãå®å šã«è§£æ±ºãããããã²ãŒã·ã§ã³ãéåžžã«é«éã«ãªããŸããã
@volgwfangããªããæ±ããŠããåé¡ã¯ããã®ãããã¯ãšã¯é¢ä¿ãããŸãããïŒ
æãåèã«ãªãã³ã¡ã³ã
ããã«ã€ããŠããå°ã詳ãã説æããŸãã å Žæã«é¢ããŠAngularã«å€æŽãå ããŸããã
ããã©ãŠã¶ã®æŽæ°ãã®éšåã§ã$ rootScopeã$ evalAsyncã$ rootScopeã$ applyAsyncã«å€æŽããŸããã
2ã€ã®æ¹æ³ã¯ãŸã£ããåãããšãããŠããããã«èŠããŸãã å®éã®$ digestã®å®è¡ã確èªãããŸã§ãéãã¯æããã«ãªããŸããã AngularJSããã€ãžã§ã¹ããå®è¡ãããšãã¹ã³ãŒãããªãŒããŠã©ãŒã¯ããããŒãã£ããŒã¿ãçæãããªããªããŸã§$ watchïŒïŒãã€ã³ãã£ã³ã°ãå®è¡ããŸãã ãã®ã©ã€ããµã€ã¯ã«äžã«ã$ applyAsyncïŒïŒãã¥ãŒãš$ evalAsyncïŒïŒãã¥ãŒã®äž¡æ¹ããã©ãã·ã¥ãããŸãã ããããããã¯2ã€ã®éåžžã«ç°ãªãå Žæã§çºçããŸãã
$ applyAsyncïŒïŒãã¥ãŒã¯ãAngularJSãããŒãã£ããŒã¿ã®ãã§ãã¯ãéå§ããåã«ã$ digestã®å é ã§ã®ã¿ãã©ãã·ã¥ãããŸãã ãã®ããã$ applyAsyncïŒïŒãã¥ãŒã¯ãæ倧ã§$ digestäžã«1åãã©ãã·ã¥ããã$ digestãéå§ãããåã«ãã¥ãŒã«æ¢ã«ããŒã¿ãå ¥åãããŠããå Žåã«ã®ã¿ãã©ãã·ã¥ãããŸãã
äžæ¹ã$ evalAsyncïŒïŒãã¥ãŒã¯ã$ digestå ã®ãããŒãã£ãã§ãã¯ããå®è£ ããwhileã«ãŒãã®å é ã§ãã©ãã·ã¥ãããŸãã ããã¯ããã€ãžã§ã¹ãäžã«$ evalAsyncïŒïŒãã¥ãŒã«è¿œå ãããåŒã¯ãåããã€ãžã§ã¹ãå ã®åŸã®æç¹ã§å®è¡ãããããšãæå³ããŸãã
ãã®éããããå ·äœçã«ããããã«ã$ watchïŒïŒãã€ã³ãã£ã³ã°å ãã$ evalAsyncïŒïŒã«ãã£ãŠè¿œå ãããéåæåŒãåããã€ãžã§ã¹ãã§å®è¡ãããããšãæå³ããŸãã $ watchïŒïŒãã€ã³ãã£ã³ã°å ãã$ applyAsyncïŒïŒã«ãã£ãŠè¿œå ãããéåæåŒã¯ãåŸã®æç¹ïŒã10msïŒã§å®è¡ãããŸãã
ããããã§ã«ããªãã®äœäººããå©ããŠãããããšãé¡ã£ãŠããŸã:-)ã