๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ 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>
์ด๊ฒ์ ๋๋ถ๋ถ์ ์ฅ์น์์ ์์๋๋ก ์คํ๋์ง๋ง iOS 9์์๋ ๋ฌดํ ๋ค์ด์ ์คํธ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
iOS 9 ๋ฒ ํ 2๋ก iPad Air 2์ iPad 4 ์ธ๋ ๋ชจ๋์์ ์ฌํ ํ ์ ์์ต๋๋ค.
iOS์ ๋ฌธ์ ์ผ ์ ์์ง๋ง ์ฌ์ ํ ์กฐ์ฌ ํ ๊ฐ์น๊ฐ์์ ์ ์์ต๋๋ค.
iOS 9์์ ๋ฐ์ํ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ง๋ง ๋ค๋ฅธ ์ฅ์น์์๋ ์ ์์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
1.4.1 / ios 9์์ 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 webview์์ ์ ์์ ์ผ๋ก ์คํ๋์ง๋ง 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 ๋ฒ ํ 3์์ ์ฌํ ํ ์ ์์ต๋๋ค.
ios9 ๊ณต๊ฐ ๋ฒ ํ (13A4293g)์์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ ์ฝ๋๋ฅผ iOS 9 ๋ฒ ํ 3 (13A4293g)์์ ํ์ธํ๋๋ฐ ๋ ์ด์ ์์ธ๋ ์๋๋๋ค. ๊ทธ๋ฌ๋ ng-view๋ฅผ ์ฌ์ฉํ๋ ์ฑ์ ์ฌ์ ํ โโios 9 ๋ฒ ํ 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
$ digest @ 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 : 22980 : 35
$ 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 ์ ํ๋ฆฌ์ผ์ด์ ์ด์๋ iOS 9์ ๊ณต๊ฐ ๋ฒ ํ 3์์๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. iOS 8์์๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ng-view ๋ฐ angular-route.js๋ฅผ ๋์ฒดํ๋ ๊ฐ๋จํ ์ง์๋ฌธ์ ์์ฑํ์ต๋๋ค. ์๋ฃจ์ ์ ์ฐ๋ฆฌ ์์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ ์๋ํ์ผ๋ฉฐ ๋ชจ๋ infdig ์์ธ๋ ios 9 ๋ฒ ํ / ๋ฒ ํ 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 ๋ฒ ํ 4๋ฅผ ์ค์นํ์ง๋ง ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋?
iOS 9 ๋ฒ ํ 3์์ ๋ดค์ง๋ง ์ฌ์ ํ iOS 9 ๋ฒ ํ 4์์๋ณด๊ณ ์์ต๋๋ค.
+1
์, ๊ฐ๋ UI ๋ผ์ฐํฐ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋์ ๋๊ตฌ๋ ์ง์ด ๋ฌธ์ ์ ๋ํด ์ ํจํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ต๋๊น?
์ต์ iOS9์ uiWebView์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ํ๋ฉ๋๋ค.
๋๊ตฌ๋ ์ง์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์ด๊ฒ์ ์ฌ์ ํ โโ๋ฌธ์ ์ ๋๋ค. ์ฌ๊ฐ
iOS ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ์นํท์์ ์ด๋๊ฐ์ ์ถ์ ๋ฉ๋๊น?
+1
+1
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. Cordova ์ฑ์ iPad Safari์์ ์น์ผ๋ก ์คํ๋๋ ๊ฒฝ์ฐ ์ ์์ ์ผ๋ก ์คํ๋์ง๋ง Cordova ์ฑ (UIWebView)์ผ๋ก ์คํ๋๋ ๊ฒฝ์ฐ ๋ฌดํ ๋ค์ด์ ์คํธ๊ฐ ๋ฐ์ํฉ๋๋ค.
@borrull ๊ณผ ๋๊ฐ์ ๋ฌธ์ ! ์ด๋ฏธ WKWebView๋ก ์คํํ์ผ๋ฉฐ ๋ฌธ์ ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๋ก์ปฌ ํ์ผ ์๋น (๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ก์ปฌ ์๋ฒ๋ฅผ ์คํํ๊ณ ์ถ์ง ์์)๊ณผ ์ฟ ํค๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ WKWebView๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ iOS 9์ Cordova / Mobile Safari์ ํจ๊ป UIWebView๋ก ๋ญ๊ฐ๋ฅผํด์ผํฉ๋๋ค. ์ ๋ ํ์ฌ Angular์์ $ locationWatch๋ฅผ ๋๋ฒ๊น ํ๊ณ ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ ๋ฒ ๋ค๋ฅธ ์์น๋ก ์ ํ ํ ๋ค์ (10 ๋ฒ ํ) ) ๋ค์ด์ ์คํธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
iOS9 bรฉta4์์ ๋์ผํ ๋ฌธ์
๊ฐ๋ ๋ฌดํ $ digest ๋ฃจํ; (
+1, WKWebView๊ฐ ์๋ โโUIWebView์์๋ง ๊ฐ๋ฅํ์ง๋ง Cordova ์ฑ์์๋ง UIWebView๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+1
์ด๊ฒ์ด iOS ํน์ ๋ฌธ์ ์ธ ๊ฒฝ์ฐ ์นํท ๋ฌธ์ ์ถ์ ๊ธฐ์์ ๋ฌธ์ ๋ฅผ ์ด๊ณ ๋ฐ๋ชจ๋ฅผ ์ ๊ณตํ์ญ์์ค! +1์ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ๋ฒ๊ทธ์ฒ๋ผ ๋ค๋ฆฌ๋ฏ๋ก ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ ๊ฒ์ ๋๋ค.
๋๊ตฐ๊ฐ ์กฐ์ฌ๋ฅผ ์ํด์ด ๋ฒ๊ทธ๋ฅผ Apple์๋ณด๊ณ ํ์ต๋๊น?
์ด ๋ฒ๊ทธ๋ฅผ ์ฌ๊ณผ์๋ณด๊ณ ํ์ต๋๋ค. ํ์ง๋ง ๋ฒ๊ทธ์ ๋ํ์ฃผ์๋ฅผ ๋๊ธฐ ์ํด ๋ชจ๋ ๋๊ฐ์ดํด์ผ ํ ์๋ ์์ต๋๋ค.
+1 ํ ์ ์๋๋ก ๋งํฌ๋ฅผ ์ ๊ณตํด ์ฃผ์๊ฒ ์ต๋๊น?
๊ทธ๊ฒ์ ๋ฒ๊ทธ ๋ฆฌํฌํฐ๋ฅผ ํตํด ์ฐ๋ฆฌ์ ๊ฐ์ธ ์ ํ ๊ณ์ ์ ์์ต๋๋ค .. ๊ทธ๋์ ๊ณต๊ฐ ๋งํฌ๊ฐ ์์ต๋๋ค; (
openradar์ ๊ฒ์ํ๊ณ ์ฐ๋ฆฌ๊ฐ ์์ผ ์ ์๋๋ก rdar ID๋ฅผ ๊ณต์ ํด ์ฃผ์๊ฒ ์ต๋๊น!
iOS9 bรฉta 5์์ ๋์ผ :
๋ชจ๋ฐ์ผ ์ฌํ๋ฆฌ์์ ์๋
๋ก์ปฌ ํ์ผ์ ์ ๊ณต ํ ์์๊ณ NSProtocol์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์์๋ WKWebview์์ ์๋ํฉ๋๋ค.
UIWebView์์ ์๋ํ์ง ์์ต๋๋ค.
IOS 9 ๋ฒ ํ 5์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
Apple์๋ ๋ฒ๊ทธ๋ฅผ ์ ๊ณ ํ์ต๋๋ค. Open Radar ๋งํฌ : https://openradar.appspot.com/22186109 (์ด๋ ๊ฒ์ผ๋ฅธ ์ฌ๋๋ค์ด ๋ฒ๊ทธ๋ฅผ ์ ๊ณ ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค). ๋ฒ๊ทธ ๋ฌธ๊ตฌ / ์ค๋ช ์ ๊ฐ์ ํ ์ ์์ผ๋ฉด ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์ ;-) Xcode ํ๋ก์ ํธ๋ฅผ ๋ค์ด๋ก๋ํ์ฌ Open Radar ํฐ์ผ์ ๋ฒ๊ทธ ์ ๊ณ ์ ํจ๊ป ์ฒจ๋ถ ํ ์ ์์ต๋๋ค (OP์ JS์ ๋ํด @santaslow ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค)
@borrull์์ ๋์ผํ Xcode ํ๋ก์ ํธ ๋ฒ์ ์ ๋ง๋ค์์ง ๋ง ng-route ๋์ ui-router๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์ ํํ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ๊ด์ฌ์๋ ์ฌ๋๋ค์ ์ฌ๊ธฐ์์ ํ๋ก์ ํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. http://s000.tinyupload.com/index.php?file_id=87281871603760127355
์ฐ๋ฆฌ๋ ๋ํ ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ๋ณด๊ณ ์์ต๋๋ค. ์ต๊ทค๋ฌ๊ฐ ํผํฉ๋์ด์์ ๋ 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๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ํ์ฌ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฒ๊ทธ๊ฐ ์ ์ต๋๋ค.
runloop๊ฐ ํ์ ํ ํ์ location.hash์ ๊ฐ์ด ์ ํํฉ๋๋ค. Angular๋ setTimeout (..., 0)์์ location.hash ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ง์ฐํ์ฌ์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด 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๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋๊ฐ์ ์ผ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ค์ $ digest ์คํ์ ๋ณผ ๋๊น์ง ์ฐจ์ด๊ฐ โโ๋ถ๋ช ํ์ง ์์ต๋๋ค. AngularJS๊ฐ ๋ค์ด์ ์คํธ๋ฅผ ์คํํ ๋ ๋ ์ด์ ๋ํฐ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋์ง ์์ ๋๊น์ง ๋ฒ์ ํธ๋ฆฌ๋ฅผ ํ์ํ๊ณ $ watch () ๋ฐ์ธ๋ฉ์ ์คํํฉ๋๋ค. ์ด ์๋ช ์ฃผ๊ธฐ ๋์ $ applyAsync () ํ์ $ evalAsync () ํ๊ฐ ๋ชจ๋ ํ๋ฌ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋งค์ฐ ๋ค๋ฅธ ๋ ๊ณณ์์ ๋ฐ์ํฉ๋๋ค.
$ applyAsync () ํ๋ AngularJS๊ฐ ๋ํฐ ๋ฐ์ดํฐ ๊ฒ์ฌ๋ฅผ ์์ํ๊ธฐ ์ ์ $ digest์ ๋งจ ์์์ ๋ง ํ๋ฌ์๋ฉ๋๋ค. ๋ฐ๋ผ์ $ applyAsync () ํ๋ $ digest ๋์ ์ต๋ ํ ๋ฒ ํ๋ฌ์๋๋ฉฐ $ digest๊ฐ ์์๋๊ธฐ ์ ์ ํ๊ฐ ์ด๋ฏธ ์ฑ์์ง ๊ฒฝ์ฐ์๋ง ํ๋ฌ์๋ฉ๋๋ค.
๋ฐ๋ฉด์ $ evalAsync () ํ๋ $ digest ๋ด๋ถ์ "dirty check"๋ฅผ ๊ตฌํํ๋ 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 :
๋ฟก ๋นต๋จ
์ต๊ทค๋ฌ ํ์ ํ ๋ฆฌํ์คํธ๋ฅผํ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
@viattik ๋ฒ๊ทธ๊ฐ UIWebView (Apple) ์์ฒด์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ํ์ด iOS9์ UIWebView์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฑํํ๋ค๋ฉด ์ ๋ฅผ ๋๋ผ๊ฒ ํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ํญ์ ์๋ ํ ์ ์์ต๋๋ค ...
์๋
ํ์ธ์.
๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์๋ ๋ง์ ๋ฒ๊ทธ๊ฐ ์์ผ๋ฉฐ ๊ฐ๋ ์ฝ๋์ ๋ฒ๊ทธ์ ๋ํ ๋ง์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ณต์์ ์ผ๋ก UIWebView๋ฅผ ์ง์ํ์ง๋ ์์ง๋ง ๋ง์ ํ์ด๋ธ๋ฆฌ๋ ์ฑ์ด ์์ ๋ ๊ฒ์ด๋ฉฐ Apple์ด ๋ฒ๊ทธ๋ฅผ ์์ ํ ๋๊น์ง ์ต์ iOS์ ํ์ด๋ธ๋ฆฌ๋ ์ฑ์์ ์ต๊ทค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ๊ฐ ๋งํ๊ณ ์ถ์ ๊ฝค ํฐ ๋ฌธ์ ์
๋๋ค.
๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ ์๋ ํ ๊ฒ์
๋๋ค.
@viattik ๋๋ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ btw : Apple์ UIWebView ๋ฒ๊ทธ๋ฅผ ์์ ํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค๊ณ ์ฐ๋ฆฌ์๊ฒ ์ ๋ฌํ์ต๋๋ค. ๊ทธ๋์ ์ค์ ๋ก : ์๋ํด๋ณด์ญ์์ค ;-)
์ฌ๋ฌ๋ถ, ์ด์์ ์ผ๋ก๋ ์ฌํ ์ฌ๋ก์ ํจ๊ป ์ด๊ฒ์ ์นํท ๋ฒ๊ทธ๋ก ๊ฒ์ ํ ์ ์๋ค๋ฉด WebKit ์ธก์ ์ผ๋ถ ์ฐ๋ฝ์ฒ์ ๋ํด ํ์ ์กฐ์น๋ฅผ ์ทจํ ๊ฒ์ ๋๋ค. https://bugs.webkit.org/
๋ฟก ๋นต๋จ
์นํท ๋ฒ๊ทธ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. iOS9์ UIWebView์์๋ง ๋ฐ์ํฉ๋๋ค. iOS9์ Safari๋ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
@ raftheunis87 ๊ทํ์ ์ฝ๋ ์ ์์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ ์๋ฒฝํ๊ฒ ์๋ํ์ต๋๋ค.
@ raftheunis87 @CleverCoder ๋ ionic-angular๋ก ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋๊น? ๋ ์์ธํ๊ฒ ์๊ธฐํด ์ฃผ ์๊ฒ ์ด์?
@abrahamrkj ๋๋ ์ด์จ์ ๋ํ ๊ฒฝํ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ionic์ ์ฌ์ฉํ ๋ ์ฌ์ฉ์ ์ ์๊ฐ ๊ฐ๋์ ์์ต๋๊น? ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์ผํ ์์ ์ด ์ด์จ ๊ฐ๋์์๋ ์๋ํ๋ค๊ณ ๋งํ ๊ฒ์ ๋๋ค ...
@ raftheunis87 https://github.com/driftyco/ionic/tree/master/js ์ด๊ฒ์ ๊ทธ๋ค์ด ์ฌ์ฉํ๋ ๊ฐ๋์ ๋๋ค.
pull ์์ฒญ์ ๊ฒฝ์ฐ @CleverCoder +1. ๋๋ ์ด๊ฒ์ด ๋ง์ ํ์ด๋ธ๋ฆฌ๋ ์ฑ์ ๋ง์น ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ค์ํ ๋ฌธ์ ๋ผ๋
๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ฒ๋ผ Angular ์ฝ๋๋ฒ ์ด์ค์ ๊ฐ๊น์ง ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ ํ์ง๋ง ํ ์์ฒญ์ด ๊ฐ๊น์ด ๋ฏธ๋์์์ ์ ์์ต๋๋ค. ๊ณง ์๋ฃจ์
์ ๋ค์ ๋ฐฉ๋ฌธํ์ฌ ๋ฐฉํ์ผ๋ก ๋ง๋ค ๊ฒ์
๋๋ค. window.location ๊ฐ์ฒด์ ์์ฑ์ด '์ฆ์'๋ณ๊ฒฝ๋์ง ์๋ ๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์
๋๋ค. ๋ด๊ฐ ํ ํ
์คํธ์์ 'popstate'๋ฐ 'hashchange'์ด๋ฒคํธ ํํฌ๊ฐ ์ ์๋ฆฌ์ ์์ง ์๋ ํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ง๋๋ ๊ฒ์ ํ์ธํ์ฌ ์ง์ฐ๋ ๋ณ๊ฒฝ์ ์์ธ์ด ์ค์ ๋ก ๋ญ๊ฐ๋ฅผ ํ ์ ์๋ค๊ณ ์๊ฐํ๊ฒ๋์์ต๋๋ค. else .. ์๋ง๋ ๊ทธ ์ฌ๊ฑด์ ํ์ด๋ฐ์ด ๋ฐ๋์์ ๊ฒ์
๋๋ค (๋๋ ๊ทธ๊ฒ์ด ๋ด๊ฐ ๊ด์ฐฐ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค).
๋๋ ์์ผ๋ก ๋ฉฐ์น ๋์ ์ด๊ฒ์ ์ง์ผ ๋ณผ ๊ฒ์ด๋ฉฐ, ๋ ๋์ ํ๋ฉด์ด ์๋ค๋ฉด, ์ง๊ธ๊น์ง ๋ด๊ฐ ์๊ณ ์๋ ๊ฒ์ ํ์ธํ๊ธฐ ์ํด ์กฐ๊ธ ๋ ๊น์ด ํ๊ณ ๋ค ๊ฒ์ด๋ฉฐ, ํ๋์ ๋ณํ๋ฅผ ๋ค๋ฃจ๊ธฐ์ ๋ ์ข์ ๊ณณ์ด ์๋ค๋ ๊ฒ์ ํ์ธํ ๊ฒ์
๋๋ค. ํผ๋ ์ค๋ฌ์ฐ๋ฉด ์ฃ์กํฉ๋๋ค. ๊ทธ ์ฌ๊ฑด๊ณผ ๊ด๋ จํ์ฌ ์์ง ์์ ํ ์ดํดํ์ง ๋ชปํ๋ ๋ง์ ์ผ์ด ์์ต๋๋ค.
๊ฑด๋ฐฐ!
... ์, @borrull , ๋์ํฉ๋๋ค. Apple์ด ๋ ์ด์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ์ด๊ฒ์ ์ฌ๊ฐํ ๋๋ฑ ๊ฑฐ๋ฆฌ๋ ์ํ ํญํ์ด๋ฉฐ ์ค์ ๋ก ์๋ชป๋ ๋๋ฅด๊ธฐ ๋ฐ ์๊ฐ๋ฝ ํฌ์ธํ ์ผ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค. ๋๋ ์์ ํด๊ฒฐ์ฑ ์ผ๋ก์ ํ์ด๋จธ์ ํฌ์ ์๋์ง๋ง (์ฐจ๋ผ๋ฆฌ ์ด๋ฌํ ๋ด์ฅ ์์ฑ์ ๋ํ ๋ก์ง ํ๋ฆ์ ๊ฐ์ ํ๊ณ ์ถ์ต๋๋ค), ์ผ๋จ ์ค์ ํ ๊ฐ ๋ณ๊ฒฝ์ ์์กด ํ ์ ์๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ด๋์ ๊ทธ๋ฆด๊น์? ์ ? ์ฐ๋ฆฌ๊ฐ ์ ๋ขฐํ ์์๋ ๋ค๋ฅธ ์์ฑ์ ๋ฌด์์ ๋๊น? ์ด์ํ ๊ฒ์ ๋๋ค.
@CleverCoder ๊ทธ๋ฅ ๊ฐ์ฌ์ ๋ง์ ์ ํ๊ณ ์ถ์์ต๋๋ค. ํจ์น๊ฐ ์ ๋ง ํ๋ฃจ๋ฅผ ๊ตฌํ์ต๋๋ค!
@CleverCoder ์ฃผ์ด์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ ์ต๊ทค๋ฌ์์ ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ต๊ทค๋ฌ ์์ค๋ฅผ ํจ์นํ์ง ์๊ณ ์ ๊ณต๋๋ ์๋ฃจ์ ์ ํ์ํ์ต๋๋ค.
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 ์ฐธ์กฐ # 12635
@ jd-carroll : ์ ๋ง ํฅ๋ฏธ ๋กญ ๋ค์. ์๊ฐ์ด ์์ผ๋ฉด ์ค๋ ์กฐ๊ธ ๋ฆ๊ฒ ๋ค์ ๋ฐฉ๋ฌธ ํ ์ ์์ต๋๋ค. ๋ฌผ๊ฑด์ผ๋ก ๊ฝค ํ ๋ป ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๋ ๋ง์ ์์๊ป๋ผ๋ฅผ ๋ง๋ญ๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ location. * ๊ฐ ์ ๋ฐ์ดํธ์ ์ง์ฐ์ ๋์ ํด์๋ ์๋๋ ๋ณ๋์ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
@realityfilter : ๋ฐ์ฝ๋ ์ดํฐ์ ๋ํด ์ธ๊ธํ๋ ๊ฒ์ด ์ฌ๋ฏธ
๋ชจ๋ ์๋
,
์ด ์์ ์ด ์์ ํ๊ธฐ ์ฌ์ด ์ฝ๋์ ๋ฒ๊ทธ๋ฅผ ๋์
ํ๋ค๊ณ ๋ง๋ถ์ด๊ณ ์ถ์์ต๋๋ค.
ํ ํ๋ฆฟ์๋ href = "#"๋ฐ ng-click = "someCall ()"์ ์ฌ์ฉํ๋ ์ต์ปค ํ๊ทธ๊ฐ ์์ต๋๋ค. href๋ก ์ธํด์ด ์์ ์ ์ฌ์ฉํ์ฌ ์ฌ์ดํธ๊ฐ index.html๋ก ์ด๋ํ์ต๋๋ค. href๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
Ionic์ ๋ค๋ก ๋ฒํผ ํ์ ์ค์ ์ฑ์ด ์ค๋จ๋ฉ๋๋ค. ๋จผ์ ์๋ณด๊ธฐ๋ก ์ด๋ ํ ๋ค์ ๋ถ๋ถ์ ์ผ๋ก ์ด์ ๋ณด๊ธฐ๋ก ๋์์จ ๋ค์ Ionic์ ๋ชจ๋ ํด์๋์์ IOS9 ๋ฒ ํ์ ์๋ณด๊ธฐ๋ก ๋ค์ ์ด๋ํฉ๋๋ค.
iOS 9 ๋ฒ ํ 5 13A4325c, Angular 1.4.0 (cordova-ios 3.9.1 ํฌํจ)๊ณผ ๋์ผํ ๋ฌธ์ ์ ๋๋ค. ๊ธฐ๋ณธ UIWebView ๋ฒ๊ทธ๊ฐ ์์ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Angular v1.2.27์์ ๋ฐ์ํ๋ ๋์ผํ ๋ฌธ์
1.2.27 ๋ฆด๋ฆฌ์ค๊น์ง ์ถ์ ํ์ง๋ง ๋ฒ๊ทธ๋ ์ด์ 1.2.26 ๋ฆด๋ฆฌ์ค์ ์์ต๋๋ค.
ํนํ์ด ์ปค๋ฐ ์ด ๋ฒ์ธ์ ๋๋ค.
@damrbaby ๋ด๊ฐ ๋ญ๊ฐ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ Mobile Safari์์ ์ต์ ๋ฒ์ ์ angular์ ํจ๊ป ์๋ํ๋ค๋ ์ฌ์ค์ iOS 9์์ uiWebView๋ก ๋ฌด์ธ๊ฐ๋ฅผํด์ผํ๋ค๋ ๊ฒ์ ๋ถ๋ช ํํฉ๋๋ค. ๋ฐ๋ผ์ Angular ์์ค ์ฝ๋์์ ๋ณ๊ฒฝ ํ ์ฌํญ์ด ๋ฐ๋์ ๋์ ๊ฒ์ ์๋๋๋ค.
@CleverCoder @realityfilter @ jyc66 ๊ฐ์ฌํ๋ค๊ณ ๋งํ๊ณ ์ถ์์ต๋๋ค.
iOS9 GM Seed์ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ฑ์ ์ ๋ฐ์ดํธํ์ญ์์ค!
iOS9 GM (13A340)์ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ Apple์ด ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๊ฐ ๋จ ๋ ธ๊ณ ์ฑ์ด ์ถฉ๋ํ์ง ์๋๋ก ์ฑ์ ๋ค์ ์ ๋ฐ์ดํธํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค (์ผ๋ถ๋ ๋ช ๋ฌ ๋๋ 1 ๋ ์ด์ ๋ณ๊ฒฝ๋์ง ์์). ์ดํด๊ฐ๊ฐ๋๋ค :(. Apple์ด iOS9 ์ถ์๋ฅผ ์ํด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋กํ๊ณ ์ถ์ต๋๋ค. ์ค๋๋ ์ฑ์์ ์ต์ Angular ๋ฒ์ ์ผ๋ก ์ด๋ํ๋ฉด ๋ค๋ฅธ ๊ธฐ๋ฅ๋ ์์ ๋ ์ ์์ต๋๋ค.
Angular๊ฐ iOS9์ ๋ฌธ์ ๊ฐ์๋ ์ ์ผํ ํ๋ ์ ์ํฌ์ธ์ง ์์ฌ ์ค๋ฝ์ต๋๊น?
๋ฐ๋ผ์ Ionic ํ์ @adamdbradley , @perrygovier ๋ฐ @mhartington ์ Ionic ๋ฐ ์ผ๋ฐ Angular ์ฑ์์๋ ์๋ํ๋ ์์ ์ ์ํด ํ๋ฃจ ์ข ์ผ ์์ ํด ์์ต๋๋ค. ๋ชฉํ๋ Angular๋ฅผ ์์ ํ ํ์๊ฐ์๋ ๋๋กญ ์ธ ์์ ์ด๋ฉฐ ๋๋ถ๋ถ์ 1.2+ Angular ๋ฒ์ ์์ ์๋ํฉ๋๋ค.
๋ค์์ ์ด ํจ์น ๋ฅผ ์ ์ฉํ์ฌ $browser
๋ฅผ ์ฅ์ํ๊ณ ์์ ํ๋ ํ์ฌ ๋ฒ๋ค ์๋ฃจ์
์
๋๋ค. ์ฐธ๊ณ : ์ด๊ฒ์ 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 ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. CDN ํ์ผ์ ๊ฑฐ๊ธฐ์๋ง ์์ผ๋ฏ๋ก ์ง๊ธ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
ํ ์คํธํ๋ ค๋ฉด angular ๋๋ ionic.bundle.js ํ์ผ ์๋์์ด ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ๋ฐฐ์นํ์ญ์์ค.
<script src="https://code.ionicframework.com/patch/ios9-$browser-patch.js"></script>
๋ํ ํ์ฌ iOS9์์ ์คํ ์ค์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ํจ์น๋ฅผ ์ ์ฉํฉ๋๋ค. iOS 9 UIWebView์์๋ง ์คํ๋๋๋ก ๊ณง ์์ ๋ ์์ ์ ๋๋ค.
์ฌ๊ธฐ์์ ํด๋น Ionic ๋ฌธ์ ๋ฅผ ๋ฐ๋ฅด์ธ์ : https://github.com/driftyco/ionic/issues/4082#issuecomment -139079725
์๋ ํ์ธ์,
UI-sref๋ ๋งค๋ ฅ์ฒ๋ผ ์๋ํ์ง๋ง $ state.go๋ ๋ค๋ก ๋ฒํผ ์ ๋๋ฉ์ด์
์ ์ค๋จํฉ๋๋ค.
์ด ์์ ์ฌํญ์ ์ ์ฉํ ํ์๋ ํ์ด์ง๊ฐ ๋ง์ด ๊น๋ฐ์
๋๋ค.
๋ฌธ์ ์ธ์ฌ,
์์ ์ด ์ฑ
2015 ๋ 9 ์ 10 ์ผ ๋ชฉ์์ผ ์ค์ 6:23์ Max Lynch [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ทธ๋์ @adamdbradley https://github.com/adamdbradley , @perrygovier
https://github.com/perrygovier ๋ฐ @mhartington
Ionic ํ์ https://github.com/mhartington ์ด ์์ ์ค์ ๋๋ค.
Ionic ๋ฐ ์ผ๋ฐ Angular ์ฑ์์ ์๋ํ๋ ์์ ์ฌํญ์ ๋ํด ํ๋ฃจ ์ข ์ผ
์. ๋ชฉํ๋ ์์ ์ด ํ์์๋ ๋๋กญ ์ธ ์์ ์ ๋๋ค.
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 ํ์ผ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
ํ๋ก๋์ ์ ๊ฒฝ์ฐ์๋ง ์์ผ๋ฏ๋ก ์ง๊ธ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.๊ทธ๊ฒ์ ํ ์คํธํ๊ณ ์ด๋ป๊ฒ ์งํ๋๋์ง ์๋ ค์ฃผ์ญ์์ค. ๊ฐ์ฌํฉ๋๋ค.
ํ ์คํธํ๋ ค๋ฉด์ด ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ๊ฐ๋ ๋๋
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
.
์ด ๋ฒ๊ทธ๊ฐ ์ฌ์ ํ iOS 9.1 ๋ฒ ํ 1์ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ $state.go
์ ๋ง์ด ์ฌ์ฉํ๋ฉฐ ์ฌ์ ํ ์ํ๊ฐ์ ๊น๋ฐ์ด๊ฑฐ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ ํ๋์ง ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ์์ ์ด ์ฑ์์ ์๋ํฉ๋๋ค. ์ด์ https๋ฅผ ํฌํจํด์ผํฉ๋๋ค.
http CDN ๋์ CND ๋งํฌ๋ ios9๊ฐ https ๋ง ํ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
https๋ฅผ ์ฌ์ฉํ ํ ์ฑ์ด ์๋ํ์ต๋๋ค.
https://code.ionicframework.com/patch/ios9- $ browser-patch.js
2015 ๋
9 ์ 10 ์ผ ๋ชฉ์์ผ ์คํ 3:22, Tyler Crammond notification@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, ionic 1.0.0.
Jorisw, ios9 ๊ฐ์ง ์ฝ๋๋ฅผ ๋นํ์ฑํํ๊ณ ์๋ํ๋์ง ํ์ธํ์ญ์์ค.
var isIOS9 = (navigator.userAgent.indexOf ( 'Version / 9.')! = -1) && (navigator.appVersion.indexOf ( '9_0')! = -1);
if (! isIOS9) {
// iOS9 UIWebView๊ฐ ์๋ โโ๊ฒฝ์ฐ ํจ์นํ์ง ์์
return $ 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
์, ๋๋ OS๊ฐ 9 ๋ฏธ๋ง์ธ์ง ํ ์คํธํ๊ณ ์ด๋ฌํ ๊ฒฝ์ฐ ์์ ์ ๋นํ์ฑํ ํ ์ ์์ต๋๋ค. ํ์ฌ ํ์ธ์ ๊ณง ์ถ์ ๋ iOS 9.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์ ์ดํ ๋ฆด๋ฆฌ์ค์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์๋ ์ฌ๋์ด ์์ต๋๊น?
์ง๊ธ 9.1 ๋ฒ ํ๋ฅผ๋ก๋ ์ค์ด๋ฉฐ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์ฌ์ฉ์ ์์ด์ ํธ ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํ์ฌ ์ถ์ ๋ ๋ฒ๋ค์ ์ผ๋ถ๋ก ํจ์น๋ฅผ ์ ๊ณต ํ ๋ ์ ๋ฅผ ์ํด ์ผํ์ต๋๋ค. ๋น์ด ์จ์ฑ, ๊ฐ๋ ์ฑ์ ๋๋ค. ์ค๋ ๋ฐค ๋ ์กฐ์ฌํ์ฌ ๋ชจ๋ ๊ฒ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
๋ ธ๋ ฅ์ ๊ธฐ์ธ์ธ ์ด์จ ํ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋ฐ๋ผ์ 9.1beta 1์๋ ์์ง ์์ ์ฌํญ์ด ์์ต๋๋ค. ๋๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ์ด์ํ๊ฒ ๋ณด์ผ ์ ์์ง๋ง , ํจ์น๊ฐ iOS 9์ ์ ์ฉ๋ ๋ String.split () ํจ์๊ฐ ์ ๋๋ก ์๋ํ์ง ์๋ ๊ฒ์ ๋ณด๋ ์ฌ๋ https://www.dropbox.com/s/hxgct9y0f9z6yci/Screenshot%202015-09-11%2000.40.26.png?dl=0
๋ ๋นํฉํด! ๋ฌผ๋ก 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 ๋น์ ์ commet์ ํ
์คํธํ๊ณ ์ถ์ง๋ง ์ด๋ค ํ์ผ์ ์์ ํด์ผํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ...
์ด๋ค ํ์ผ์ ์์ ํด์ผํ๋์ง ์๋ ค์ค ์ ์์ต๋๊น?
iOS9 UIWebView์์๋ง ์คํ๋์ด์ผํ๋ค๋ ์ ํ์์ด ionic์ ํจ์น๊ฐ ๊ธฐ๋ฐ์ผ๋กํ๋ @CleverCoder ์ ํจ์น๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ทธ ๋ฌธ์ ์ ๋ํด UIWebView iOS8, safari ๋๋ Android์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,์ด ํจ์น๋ฅผ ํ ์คํธ ํด ์ฃผ์๊ฒ ์ต๋๊น : https://gist.github.com/IgorMinar/863acd413e3925bf282c
Angular 1.2 โ 1.4.5์์ ์๋ํ๋ฉฐ Angular ์ ๋ฐ์ดํธ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ด๋ฅผ ์ฑ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์์ ์ ์์ต๋๋ค.
1.4.6์ ์ ์ ํ ์์ ์ด์์ ์์ ์ด์ง๋ง ๊ทธ ๋์์ด ๋ ๋ฆฝ ์คํ ํ ํจ์น๋ ์์ ์ ๊ตฌํ๊ณผ ๋ฐฐํฌ๋ฅผ ์ฉ์ดํ๊ฒํ์ฌ ์ ์ํ๊ฒ ๋ฐฐํฌ ํ ์ ์๋๋กํฉ๋๋ค.
์๋ ํ์ธ์ @IgorMinar -Angular 1.3 (Ionic beta-14) ๋ฐฐํฌ์์ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. 1.3์ ๋ชจ๋์์ .decorator ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น?
์กํ์ง ์์ TypeError : angular.module (...). decorator๋ ํจ์๊ฐ ์๋๋๋ค (์ต๋ช ํจ์) @ angular-ios9-uiwebview.patch.js : 33
@rajatrocks uhh .. ์ข์ ์ง์ ์ ๋๋ค. module.decorator๋ 1.4 ๊ธฐ๋ฅ ์ ์ฉ์ ๋๋ค. ํจ์น๋ฅผ ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
@rajatrocks ์์ ์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค @IgorMinar , "์ค์น"์ด์ ๊ด์ฐฎ์ต๋๋ค. Ionic ์ค๋ ๋์ ๋ํ ์๊ฒฌ์ ๋จ๊ธธ ๊ฒ์ ๋๋ค.
@IgorMinar js ํ์ผ์ ํฌํจํ๊ณ ๋ด app.js์ ๋ค์์ ์ถ๊ฐํ์ต๋๋ค. ๋ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค.
๊ทํ์ ํจ์น @IgorMinar ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง, @mlynch์์ ํ๋ํ์ง ์์๋ค.
iOS ํ๋ซํผ์๋ง ์ ์ฉ๋๋๋ก ๊ฐ๋จํ Cordova ํํฌ๋ฅผ ๋ง๋ค์์ต๋๋ค.
https://gist.github.com/DURK/f2acd6bca4759e719801
์ ๋ฐ์ดํธ : ์, ํจ์น์ ์ฒดํฌ๊ฐ ํฌํจ๋์ด์์ด iOS9์๋ง ์ ์ฉ๋ฉ๋๋ค.
@IgorMinar @DURK ์ @jprangenberg ๊ฐ๋ณด๊ณ ํ ๋ด์ฉ์ ์ด์ด iPad Air 2์์ ํ ์คํธ ํ ๋ "isIOS9UIWebView"๊ธฐ๋ฅ์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. shim์ ํญ์ ์ ์ฉํ๋๋ก ๊ฐ์ ํ๋ฉด ํจ์น๊ฐ ์๋ํฉ๋๋ค.
๋ด ์๊ฒฌ์์ : https://github.com/driftyco/ionic/issues/4082#issuecomment -139567128
@IgorMinar , ๊ทํ์ ํจ์น๋ iOS 9 iPhone UIWebView์์ ์ ์๋ํ์ง๋ง iPad ์ฉ ์ฌ์ฉ์ ์์ด์ ํธ ๊ฐ์ง์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
UIWebView์ iOS 9 iPhone ์ฌ์ฉ์ ์์ด์ ํธ :
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13A340
UIWebView์ iOS 9 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 cordova ํํฌ๋ ํ์ํ์ง ์์ต๋๋ค. ํจ์น๋ ํ์ํ์ง ์์ ํ๋ซํผ์์๋ ์๋ฌด๊ฒ๋ํ์ง ์์ต๋๋ค.
iOS9์ @JeremyPlease 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์ ์ํฅ์์ฃผ์ง ์์ต๋๋ค.
๋ฒ๊ทธ๋ iOS 9์ UIWebView์๋ง ์์ต๋๋ค. WKWebView๋ฅผ ์ฌ์ฉํ ๋ ์กด์ฌํ์ง ์์ต๋๋ค.
์ด ์ฌ๋๋ค์ ๋ํ ๊ทํ์ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ๋ถํํ๋ ์ ์๊ฒ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ์ ๋๋ฉ์ด์ ์ด ๊นจ์ง๊ณ , ํ์ด์ง๊ฐ ์ ํ๋ก๋๋์ง ์๊ณ , ํ์ด์ง๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ๋ก๋๋์ง ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ฐํฐ๊ฐ ์์ ํ ๋ถ์์ ํฉ๋๋ค.
Ionic ๋ฒ๋ค 1.1.0 ๋ฐ iOS 9.1์ iPhone 6์์ https://code.ionicframework.com/patch/ios9- $ browser-patch.js์ ํจ์น ํ์ผ๊ณผ ํจ๊ป ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
์ค๋ฅ : [$ rootScope : infdig ] 10 $ digest () ๋ฐ๋ณต์ ๋๋ฌํ์ต๋๋ค. ์ค๋จ!
์ต๊ทผ 5 ํ ๋ฐ๋ณต์์ ์คํ ๋ ๊ฐ์์ : []
์ด๋ค ์ ์?
๊ฐ์ฌ!
@scottopolis ๋ Igor์ ํจ์น๋ฅผ ์ฌ์ฉํด https://gist.github.com/IgorMinar/863acd413e3925bf282c
@petebacondarwin ๊ฐ์ฌํฉ๋๋ค, Igor์ ํจ์น๊ฐ ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค. ๋ด ํ์ด์ง ์ ํ ์ ๋๋ฉ์ด์ ์ด ๊ณ ๋ฅด์ง ์์ง๋ง ๋ผ์ฐํฐ๊ฐ ์์ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ์ฃผ์ํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์์ ์ผ๋ถ ํ ์คํธ์ @IgorMinar ์ ํจ์น๋ก ์ธํด ๋ค๋ก ๋ฒํผ ์ ๋๋ฉ์ด์ ๋ฐ ์ปจํธ๋กค๋ฌ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ค๋ก ํด๋ฆญํ๋ฉด ๋ค์ ์์ฑ๋์ง ์๋๋ก ๋ค๋ก ๋ฌผ๋ฌ๋๊ณ ์๋ ํ๋ฉด์ ์ปจํธ๋กค๋ฌ๊ฐ ํ์๋ฉ๋๋ค. ์ด๋ก ์ธํด ์ ๋๋ฉ์ด์ ์ด ํ๋ฉด ๋ฐ์ผ๋ก ์ด๋ํ ๋ ํด๋น ๋ทฐ์์ ์คํ๋๋ ๋ชจ๋ ์ข ๋ฅ์ ์ด์ํ ์ผ์ด ๋ฐ์ํฉ๋๋ค.
์ง๊ธ๊น์ง ionic์์ nightly๋ฅผ ์ฌ์ฉํ์ง๋ง 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
ionic ํ๊ณผ ํจ๊ป ์ฐ๋ฆฌ๋ ๋ ์ด์์ด ๋ฒ์ ์ ํจ์น๋ก ๊น๋ฐ์์ ์ฌํ ํ ์ ์์ต๋๋ค.
๋ ์ด์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์ ๊ทธ๋ ์ด๋ํ๊ณ ์๋ ค์ฃผ์ญ์์ค. (๋ํ ํจ์น v1.1.0 ์ธ์๋์ด ๋ฌธ์ ์ ๋ํด ๋ค๋ฅธ ํจ์น๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์์์ง ํ์ธํ์ญ์์ค).
Angular v1.4.6์ ๋ ์ด์ ํจ์น ํ ํ์๊ฐ ์๋๋ก ๋ค์ ์ฃผ์ ๋ง์คํฐ์ ์์ ์ฌํญ์ ์ ์ฉ ํ ์์ ์ ๋๋ค.
์ด ์๋ก์ด ๋ฒ์ ์ ํจ์น๋ ์ ์๊ฒ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค @IgorMinar!
๋ฆด๋ฆฌ์ค 1.4.6์ด์ด ๋ฌธ์ ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์์ ํฉ๋๊น?
@ alexislg2- ์, ์ด๋ฒ ๋ฆด๋ฆฌ์ค์์๋ ํจ์น๋ฅผ ์ ์ฉ ํ ํ์๊ฐ ์๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
ํ์ธ ๋จ, ์๋ฎฌ๋ ์ดํฐ ๋ฐ ์ฅ์น์์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ Apple ์น์ธ์ ๋ฐ๊ธฐ๊น์ง 2 ์ฃผ๋ฅผ ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค ;-(
@dbroadhurst https://openradar.appspot.com/22186109 ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ธ์ฉํ์ฌ ์ฑ ์ ๋ฐ์ดํธ๋ฅผ ๋น ๋ฅด๊ฒ ์ถ์ ํ ์ ์๋ค๊ณ ๋ค์์ต๋๋ค.
์ด WebKit ๋ฒ๊ทธ ๋ฅผ ๋ฐ๋ผ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
์๋ ํ์ธ์, Angular.js์ ํด์ ๋ณ๊ฒฝ์ ๋ํ iOS9 ๋น๋๊ธฐ ํธ์ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ฐ๊ตฌ๋ฅผํ๊ณ ๋ํ stackoverflow์ ๊ฒ์๋์์ง๋ง ์ง๊ธ๊น์ง ์ฐพ์ ์ ์ผํ ํด๊ฒฐ์ฑ ์ angular browser.js ํจ์น์ ๋๋ค.
์ ๋ ์ต๊ทค๋ฌ์๋ณ๋ก ์ต์ํ์ง ์์ต๋๋ค. ๋น์ ์ด ์์ ํ ๊ฒ์ ์ดํดํ๊ณ ์ถ์ต๋๋ค.
ํด์ ๋ผ์ฐํ
์ ๊ธฐ๋ฐ์ผ๋กํ๋ ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์๋ณํ๊ณ ์์ ํ๋์ง ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@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
๋ ๋ฒ์งธ console.log
๋ ์ ๊ฐ์ด ์๋ ์ด์ ๊ฐ์ ๋ฐํํฉ๋๋ค. ํ์ฌ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์๋ฃ๋ ํ ์ธ ๋ฒ์งธ 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 ์ ํจ์น๋ ์ฐ๋ฆฌ์๊ฒ๋ ํจ๊ณผ์ ์ด์์ต๋๋ค. ๊ฐ์ฌ!!
ํ์ง๋ง ์ฌ๋ฌ๋ถ ์ค ํ ๋ช ์ด ๋๋ต ํ ์์๋ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ด ์์ต๋๋ค.
๋๋ ๋ ์ค์ํ ๊ฒ์ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ก์ธ์คํ๋ ๊ฒ์ด Nitro ๋ ๋๋ง ์์ง์ ํ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
@tpeiffer ๊ทธ๋ค์ ์ฃผ์ ํ์ ์ค์ด์๋ ์ฌํ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ wkwebview๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋
ํ์ธ์, ์ด์ ๋ฒ์ ์ 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์์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋์ iOS 9์๋ง ๊ตญํ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. iOS 8 ๋ฐ 9 ๋ฒ์ ์ ํฌํจํ๋๋ก ์์ด์ ํธ ๋ฌธ์์ด ๊ฒ์ฌ๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. ์ฌ๊ธฐ์ ์์ด์ ํธ ๋ฌธ์์ด์ด ์์ต๋๋ค.
"Mozilla / 5.0 (iPhone, Mac OS X์ โโ๊ฐ์ CPU iPhone OS 8_4) AppleWebKit / 600.1.4 (Gecko์ ๊ฐ์ KHTML) Mobile / 12H141 (140307121489296)"
+1
์๋ ํ์ธ์
๋๊ตฐ๊ฐ iOS 9.2์์์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋์ง ํ์ธํ ์ ์์ต๋๊น? (๋ฒ ํ)
๊ฐ์ฌ :)
์ค๋ ์์นจ์ iPhone 6์์ iOS 9.2 (13C75)๋ก ์ ๋ฐ์ดํธ ๋ ๋ฌธ์ ๋ฅผ ๋ณต์ ํ ์ ์์ต๋๋ค. ์ง๊ธ๊น์ง๋ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค. ์ด ๋ฒ๊ทธ๋ ์ฌ์ ํ ์ด๋ ค ์์ต๋๋ค-https: //openradar.appspot.com/22186109
์ด ํจ์น๋ฅผ ์ ์ฉํ๋ฉด iOS 9.2 ์ด์์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๊น? ์์ฒด ์ฑ์ผ๋ก ํ ์คํธ ํ ๊ฒ์ด์ง๋ง ํน์ ์ํฉ์ ํ ์คํธ ํ ๋ ํ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
๋ด๊ฐ ๋ณผ ์์๋ ํ, ๋ชจ๋ ํจ์น๋ iOS 9 ์ด์์ ํํฐ๋งํ๋ ์ ๊ท์์ ์ฌ์ฉํ์ง๋ง ํน๋ณํ 9.x์์ 9.1๊น์ง ํํฐ๋งํ์ง๋ ์์ต๋๋ค.
์๋
ํ์ธ์,์ด ๋ฌธ์ ๋ ํ์ฌ iOS 9์ด ์ค์น๋ iPhone 6์์ ๋ฐ์ํ๊ณ ์์ต๋๋ค. ๋๊ตฌ๋ ์ง ์ด์ ๋ฅผ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
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์์ ์์ ๋์์ผ๋ฏ๋ก iOS 9.0.x์์๋ง ๋ฐ์ํฉ๋๋ค.
ionic์ ๊ฒ์ ๋ ๋ฌธ์ ๋ ๋์ผํ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๋์ผํ ์์ ์ด ์๋ฐฉํฅ์ผ๋ก ์๋ํฉ๋๋ค.
@lgalfaso ๋ต์ฅ์
๊ฐ์ฌํฉ๋๋ค @lgalfaso : +1 :
์น ์ฑ์ ํ ํ๋ฉด์ ์ถ๊ฐํ๊ณ ๋ ๋ฆฝํ์ผ๋ก ์ฌ์ฉํ ๋์ด ๋ฌธ์ ๊ฐ ์์์ง๋ง AngularJS 1.4.5์์ 1.5๋ก ์ ๊ทธ๋ ์ด๋ํ๋ฉด ๋ฌธ์ ๊ฐ ์์ ํ ํด๊ฒฐ๋๊ณ ์ง์ฅ์ฒ๋ผ ํ์ ์๋๊ฐ ๋นจ๋ผ์ก์ต๋๋ค!
@volgwfang ํ์ฌ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ํด ์กฐ๊ธ ๋ ์ค๋ช ํฉ๋๋ค. ์์น์ ๊ด๋ จํ์ฌ Angular๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค.
"์ ๋ฐ์ดํธ ๋ธ๋ผ์ฐ์ "๋ถ๋ถ์์ $ rootScope. $ evalAsync๋ฅผ $ rootScope. $ applyAsync๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋๊ฐ์ ์ผ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ค์ $ digest ์คํ์ ๋ณผ ๋๊น์ง ์ฐจ์ด๊ฐ โโ๋ถ๋ช ํ์ง ์์ต๋๋ค. AngularJS๊ฐ ๋ค์ด์ ์คํธ๋ฅผ ์คํํ ๋ ๋ ์ด์ ๋ํฐ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋์ง ์์ ๋๊น์ง ๋ฒ์ ํธ๋ฆฌ๋ฅผ ํ์ํ๊ณ $ watch () ๋ฐ์ธ๋ฉ์ ์คํํฉ๋๋ค. ์ด ์๋ช ์ฃผ๊ธฐ ๋์ $ applyAsync () ํ์ $ evalAsync () ํ๊ฐ ๋ชจ๋ ํ๋ฌ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋งค์ฐ ๋ค๋ฅธ ๋ ๊ณณ์์ ๋ฐ์ํฉ๋๋ค.
$ applyAsync () ํ๋ AngularJS๊ฐ ๋ํฐ ๋ฐ์ดํฐ ๊ฒ์ฌ๋ฅผ ์์ํ๊ธฐ ์ ์ $ digest์ ๋งจ ์์์ ๋ง ํ๋ฌ์๋ฉ๋๋ค. ๋ฐ๋ผ์ $ applyAsync () ํ๋ $ digest ๋์ ์ต๋ ํ ๋ฒ ํ๋ฌ์๋๋ฉฐ $ digest๊ฐ ์์๋๊ธฐ ์ ์ ํ๊ฐ ์ด๋ฏธ ์ฑ์์ง ๊ฒฝ์ฐ์๋ง ํ๋ฌ์๋ฉ๋๋ค.
๋ฐ๋ฉด์ $ evalAsync () ํ๋ $ digest ๋ด๋ถ์ "dirty check"๋ฅผ ๊ตฌํํ๋ while ๋ฃจํ์ ๋งจ ์์ ํ๋ฌ์๋ฉ๋๋ค. ์ฆ, ๋ค์ด์ ์คํธ ์ค์ $ evalAsync () ํ์ ์ถ๊ฐ ๋ ๋ชจ๋ ํํ์์ ๋์ผํ ๋ค์ด์ ์คํธ ๋ด์์ ๋์ค์ ์คํ๋ฉ๋๋ค.
์ด ์ฐจ์ด๋ฅผ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด $ watch () ๋ฐ์ธ๋ฉ ๋ด์์ $ evalAsync ()์ ์ํด ์ถ๊ฐ ๋ ๋น๋๊ธฐ์์ด ๋์ผํ ๋ค์ด์ ์คํธ์์ ์คํ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. $ watch () ๋ฐ์ธ๋ฉ ๋ด์์ $ applyAsync ()์ ์ํด ์ถ๊ฐ ๋ ๋น๋๊ธฐ์์ ์ดํ ์์ (~ 10ms)์ ์คํ๋ฉ๋๋ค.
์ด๊ฒ์ด ์ด๋ฏธ ๋น์ ์ค ์ผ๋ถ์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค :-).