Angular.js: IOS 9 w/UIWebView рдкрд░ рд╕реНрдерд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдЕрдирдВрдд рдбрд╛рдЗрдЬреЗрд╕реНрдЯ (Safari/WKWebView рдореЗрдВ рдирд╣реАрдВ)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЬреВрди 2015  ┬╖  154рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: angular/angular.js

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ 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>

рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдИрдУрдПрд╕ 9 рдкрд░ рдПрдХ рдЕрдирдВрдд рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред
рдореИрдВ рдЖрдИрдУрдПрд╕ 9 рдмреАрдЯрд╛ 2 рдХреЗ рд╕рд╛рде рдЖрдИрдкреИрдб рдПрдпрд░ 2 рдФрд░ рдЖрдИрдкреИрдб рдЪреМрдереА рдкреАрдврд╝реА рджреЛрдиреЛрдВ рдкрд░ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред
рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЖрдИрдУрдПрд╕ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗред рдореИрдВрдиреЗ рд╕реНрдерд╛рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдгреАрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИред
"рдЕрдкрдбреЗрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░" рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ $rootScope.$evalAsync рдХреЛ $rootScope.$applyAsync рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдЕрдВрддрд░ рддрдм рддрдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рддрдХ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ $digest рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддреЗред рдЬрдм AngularJS рдПрдХ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдХреЛрдк рдЯреНрд░реА рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ $watch() рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдФрд░ рдЧрдВрджрд╛ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЗ рджреМрд░рд╛рди, $applyAsync() рдХреНрдпреВ рдФрд░ $evalAsync() рдХреНрдпреВ рджреЛрдиреЛрдВ рдлрд╝реНрд▓рд╢ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ; рд▓реЗрдХрд┐рди, рдпрд╣ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╣реЛрддрд╛ рд╣реИред

$applyAsync() рдХрддрд╛рд░ рдХреЗрд╡рд▓ $digest рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╝реНрд▓рд╢ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ AngularJS рдЧрдВрджреЗ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдБрдЪ рд╢реБрд░реВ рдХрд░реЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, $applyAsync() рдХрддрд╛рд░ рдХреЛ $digest рдХреЗ рджреМрд░рд╛рди рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдПрдХ рдмрд╛рд░ рдлреНрд▓рд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдлрд╝реНрд▓рд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдХрддрд╛рд░ $digest рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреЙрдкреНрдпреБрд▓реЗрдЯ рд╣реЛ рдЧрдИ рд╣реЛред

рджреВрд╕рд░реА рдУрд░, $evalAsync() рдХрддрд╛рд░, рдЙрд╕ рд╕рдордп-рд▓реВрдк рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╝реНрд▓рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдЬреЛ $digest рдХреЗ рдЕрдВрджрд░ "рдбрд░реНрдЯреА рдЪреЗрдХ" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдХреЗ рджреМрд░рд╛рди $evalAsync() рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдХрд┐рд╕реА рднреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдЙрд╕реА рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдореЗрдВ рдмрд╛рдж рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдареЛрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ $evalAsync() рджреНрд╡рд╛рд░рд╛ $watch() рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рднреАрддрд░ рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЙрд╕реА рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВрдЧреЗред рдПрдХ $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
    });

рд╕рднреА 154 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрджреНрджреЗ рд╕реЗ рдорд┐рд▓рд╛, рдЬреЛ рдЖрдИрдУрдПрд╕ 9 рдкрд░ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдареАрдХ рдЪрд▓рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ 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>

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░, рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рдЖрдИрдУрдПрд╕ 8 рд╡реЗрдмрд╡реНрдпреВ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдУрдПрд╕ 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) рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдЕрдм рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдирдЬреА-рд╡реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдРрдк рдЕрднреА рднреА рдЖрдИрдУрдПрд╕ 9 рдмреАрдЯрд╛ 3 рдкрд░ рдЗрдВрдлрдбрд┐рдЧ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ ios9 рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреАрдЯрд╛ (13A4293g) рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ

рддреНрд░реБрдЯрд┐: [$ rootScope: infdig ] 10 $digest() рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ред рдЧрд░реНрднрдкрд╛рдд!
рдкрд┐рдЫрд▓реЗ рел рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкрд╣рд░реЗрджрд╛рд░реЛрдВ рдиреЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛: []
http://errors.angularjs.org/1.3.13/ $rootScope/infdig?p0=10&p1=%5B%5D
рдлрд╝рд╛рдЗрд▓:///рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдореИрдХ5/рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рдбреЗрд╡рд▓рдкрд░/рдХреЛрд░рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░/рдбрд┐рд╡рд╛рдЗрд╕/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/рдбреЗрдЯрд╛/рдХрдВрдЯреЗрдирд░/рдмрдВрдбрд▓/рдПрдкреНрд▓рд┐рдХреЗрд╢рди/9B5EE368-F2A0-4C99-807B-EA17B2479E58/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-EA17Bshop. рдРрдк/www/lib/ionic/js/ionic.bundle.js:22980:35
$apply@file : /// рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/mac5/рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рдбреЗрд╡рд▓рдкрд░/рдХреЛрд░ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░/рдбрд┐рд╡рд╛рдЗрд╕/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/рдбреЗрдЯрд╛/рдХрдВрдЯреЗрдирд░/рдмрдВрдбрд▓/рдПрдкреНрд▓рд┐рдХреЗрд╢рди/9B5EE368-F2A0-4C99-807B-EA17Bshop. рдРрдк/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/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-EA17Bhops.app /www/lib/ionic/js/ionic.bundle.js:11713:25
рдбрд┐рд╕реНрдкреИрдЪрдЗрд╡реЗрдВрдЯ @ [рдореВрд▓ рдХреЛрдб]
рдЯреНрд░рд┐рдЧрд░рдорд╛рдЙрд╕рдЗрд╡реЗрдВрдЯ@рдлрд╝рд╛рдЗрд▓ : ///рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдореИрдХ5/рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рдбреЗрд╡рд▓рдкрд░/рдХреЛрд░рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░/рдбрд┐рд╡рд╛рдЗрд╕/749DE7E3-D93F-47F9-A1FC-E3D54A1CCEEE/рдбреЗрдЯрд╛/рдХрдВрдЯреЗрдирд░/рдмрдВрдбрд▓/рдПрдкреНрд▓рд┐рдХреЗрд╢рди/9B5EE368-F2A0-4C99-807B-EA17B /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-EA17B2479Eapp. /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-EA17B /www/lib/ionic/js/ionic.bundle.js:2975:13

рд╣рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рдЖрдИрдУрдПрд╕ 9 рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреАрдЯрд╛ 3 рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдгреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣реА рд╣реИред рдпрд╣ рдЖрдИрдУрдПрд╕ 8 рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ ng-view рдФрд░ angular-route.js рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрд╛ред рд╕рдорд╛рдзрд╛рди рдиреЗ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдЖрдИрдУрдПрд╕ 9 рдмреАрдЯрд╛/рдмреАрдЯрд╛ 3 рдкрд░ рд╕рднреА infdig рдЕрдкрд╡рд╛рдж рдЧрд╛рдпрдм рд╣реЛ рдЧрдПред рдиреАрдЪреЗ рд╕рд░рд▓реАрдХреГрдд рдХреЛрдб рд╣реИ, рдЬреЛ рд╕рд┐рд░реНрдл рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛:

(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 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЕрднреА рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдХреЛрдИ рдФрд░?

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдИрдУрдПрд╕ 9 рдмреАрдЯрд╛ 3 рдореЗрдВ рджреЗрдЦрд╛ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЕрднреА рднреА рдЖрдИрдУрдПрд╕ 9 рдмреАрдЯрд╛ 4 рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред

+1

рд╣рд╛рдБ, рд╣рдо рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЛрдгреАрдп рдпреВрдЖрдИ рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рд╛рде рднреА рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЗрд╕ рдмреАрдЪ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╡реИрдз рдХрд╛рдордХрд╛рдЬ рд╣реИ?

рдирд╡реАрдирддрдо iOS9 рдкрд░ uiWebView рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ?

рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИред рдкреБрди: рдЦреЛрд▓рдиреЗ рд╕реЗ

рдпрд╣ рдПрдХ рдЖрдИрдУрдПрд╕ рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рд╡реЗрдмрдХрд┐рдЯ рдкрд░ рдХрд╣реАрдВ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

+1

+1

рдореБрдЭреЗ рднреАред рдЖрдИрдкреИрдб рд╕рдлрд╛рд░реА рдкрд░ рд╡реЗрдм рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рдиреЗ рдкрд░ рд╣рдорд╛рд░рд╛ рдХреЙрд░реНрдбреЛрд╡рд╛ рдРрдк рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдирдВрдд рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХреЙрд░реНрдбреЛрд╡рд╛ рдРрдк (UIWebView) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред

рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреИрд╕реЗ @borrull ! WKWebView рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕рдорд╕реНрдпрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо WKWebView рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдФрд░ рдХреБрдХреАрдЬрд╝ред рддреЛ рдЗрд╕реЗ рдЖрдИрдУрдПрд╕ 9 рдкрд░ рдХреЙрд░реНрдбреЛрд╡рд╛/рдореЛрдмрд╛рдЗрд▓ рд╕рдлрд╛рд░реА рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ UIWebView рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдгреАрдп рдореЗрдВ $ locationWatch рдбреАрдмрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд╛рди рдкрд░ рдХрдИ рдмрд╛рд░ рд╕рдВрдХреНрд░рдордг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ (10 рдмрд╛рд░ рдХреЗ рдмрд╛рдж) ) рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдПрд░рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

iOS9 рдмреАрдЯрд╛4 рдкрд░ рдпрд╣рд╛рдБ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ
рдХреЛрдгреАрдп рдЕрдирдВрдд $ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рд▓реВрдк ;(

+1, рдХреЗрд╡рд▓ UIWebView рдореЗрдВ, WKWebView рдореЗрдВ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдиреЗ рдХреЙрд░реНрдбреЛрд╡рд╛ рдРрдк рдореЗрдВ рдХреЗрд╡рд▓ UIWebView рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

+1

рдпрджрд┐ рдпрд╣ рдПрдХ рдЖрдИрдУрдПрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рд╡реЗрдмрдХрд┐рдЯ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдкрд░ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдХ рдбреЗрдореЛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ! +1 рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рдмрдЧ рдХреА рд╕реВрдЪрдирд╛ Apple рдХреЛ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рджреА рдереА?

рдореИрдВрдиреЗ рд╕реЗрдм рдХреЛ рдЗрд╕ рдмрдЧ рдХреА рд╕реВрдЪрдирд╛ рджреАред рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрдЧ рдкрд░ рдЙрдирдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХреЛ рдРрд╕рд╛ рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо +1 рдХрд░ рд╕рдХреЗрдВ?

рдпрд╣ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдРрдкреНрдкрд▓ рдЦрд╛рддреЗ рдореЗрдВ рд╣реИ .. рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓рд┐рдВрдХ рдирд╣реАрдВ ;(

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ openradar рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ rdar id рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдзреЛрдЦрд╛ рджреЗ рд╕рдХреЗрдВ!

iOS9 рдмреАрдЯрд╛ 5 рдкрд░ рднреА рдРрд╕рд╛ рд╣реА:
рдореЛрдмрд╛рдЗрд▓ рд╕рдлрд╛рд░реА рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
WKWebview рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдерд╛рдиреАрдп рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реЗрд╡рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ NSProtocol рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
UIWebView рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рдЖрдИрдУрдПрд╕ 9 рдмреАрдЯрд╛ 5 рдкрд░ рднреА рдРрд╕рд╛ рд╣реА рд╣реИ

рдореИрдВрдиреЗ рдРрдкреНрдкрд▓ рдХреЗ рд╕рд╛рде рднреА рдПрдХ рдмрдЧ рджрд╛рдпрд░ рдХрд┐рдпрд╛ред рдУрдкрди рд░рд╛рдбрд╛рд░ рд▓рд┐рдВрдХ рд╣реИ: https://openradar.appspot.com/22186109 (рдЗрд╕рд╕реЗ рдЖрд▓рд╕реА рд▓реЛрдЧреЛрдВ рдХреЛ рдмрдЧ рдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП)ред рдпрджрд┐ рдЖрдк рдмрдЧ рд╢рдмреНрдж/рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреА рджреЗрдВ ;-) рдЖрдк рдУрдкрди рд░рд╛рдбрд╛рд░ рдЯрд┐рдХрдЯ рдкрд░ рдмрдЧ рдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдХреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдУрдкреА рдореЗрдВ рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП

рдореИрдВрдиреЗ рдЙрд╕реА рдПрдХреНрд╕рдХреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рд╣реИ (@borrull рд╕реЗ) рд▓реЗрдХрд┐рди рдПрдирдЬреА-рд░реВрдЯ рдХреЗ рдмрдЬрд╛рдп рдпреВрдИ-рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рд╛рдеред рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдореБрджреНрджрд╛ред рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣рд╛рдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: http://s000.tinyupload.com/index.php?file_id=87281871603760127355

рд╣рдо рднреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореБрджреНрджрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдХрд┐ рд╕реНрдерд╛рдиред * рдХреЛрдгреАрдп рдорд┐рд╢реНрд░рдг рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рдЧреБрдг рддреБрд░рдВрдд рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рди.рд╣реИрд╢ (рдЬреИрд╕реЗ рд╕реНрдерд╛рди рд╕реЗрд╡рд╛ рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддреБрд░рдВрдд рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдкрдврд╝реЗрдВ, рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкреЙрдкрд╕реНрдЯреЗрдЯ рдФрд░ рд╣реИрд╢рдЪреЗрдВрдЬ рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ jqlite рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреБрдЫ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

рдЬрдм рдореИрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реВрдБ рддреЛ рдореИрдВ рдПрдХ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЕрдкрд▓реЛрдб рдХрд░реВрдБрдЧрд╛ред

+1

@CleverCoder рдирдореВрдиреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рдореБрдЭреЗ рд╕реБрдмрд╣ рдореЗрдВ рд░реЗрдкреНрд░реЛ рдХреЗрд╕ рдЦрддреНрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рдкреВрд░реЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдмрд╛рдВрдзрд╛ рдЧрдпрд╛ рд╣реИред рдердкрдердкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЬреИрд╕рд╛ рдХрд┐ iOS 9 рдХреА рдЧрд┐рдирддреА рд╣реЛрддреА рд╣реИ, рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░рд╛ рдирд┐рд╣рд┐рдд рд╕реНрд╡рд╛рд░реНрде рд╣реИред рдореИрдВ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдХреБрдЫ рдЕрдкрд▓реЛрдб рдХрд░реВрдВрдЧрд╛ред

+1

рдореИрдВрдиреЗ рдЬреЛ рдореВрд▓ рдХрд╛рд░рдг рдорд╛рдирд╛ рд╣реИ рдЙрд╕реЗ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реНрдерд╛рди рд╣реИрд╢ рдпрд╛ href рдЧреБрдг рд╕реЗрдЯ рдХрд░рдирд╛ рддреБрд░рдВрдд "рд▓рд╛рдЧреВ" рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ XCode рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
https://www.dropbox.com/s/2jkwv2thhm86nly/iOS%209%20Location%20Bug.zip?dl=0
рдЕрдЧрд░ рдЖрдк рдлрд╝рд╛рдЗрд▓ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдкрд░рд┐рдгрд╛рдореА рдорд╛рди рдХреЛ location.hash рдореЗрдВ рджреЗрдЦреЗрдВ, рд╕рд╛рде рд╣реА рд╕рдлрд╛рд░реА рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'рдкреЙрдкрд╕реНрдЯреЗрдЯ' рдФрд░ 'рд╣реИрд╢рдЪреЗрдВрдЬ' рдЗрд╡реЗрдВрдЯреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХреБрдЫ рдЗрд╡реЗрдВрдЯ рдкреНрд▓рдВрдмрд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрджрд▓рд╛рд╡ рдХреЛ рдЯрд╛рд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХреБрдЫ рд╣реИред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реИред

  • рд╢реЙрди

рд╣рдо State.go рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп window.location.href рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрдо рдЫреЛрдЯреА рдЧрд╛рдбрд╝реАред

рд▓реЛрдХреЗрд╢рди.рд╣реИрд╢ рдХрд╛ рдорд╛рди рд░рдирд▓реВрдк рдХреЗ рдПрдХ рд╕реНрдкрд┐рди рдХреЗ рдмрд╛рдж рд╕рд╣реА рд╣реЛрдЧрд╛ред рдПрдВрдЧреБрд▓рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓реЛрдХреЗрд╢рди рдореЗрдВ рджреЗрд░реА рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 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 рд╡рд┐рдзрд┐ рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдПрдХ рд╕реЗрдЯрдЯрд╛рдЗрдо рдЬреЛрдбрд╝рд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдХреЛрдгреАрдп рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред https://gist.github.com/hober/a29b6c28ac1744c800dd

рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗред рдореИрдВрдиреЗ рд╕реНрдерд╛рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдгреАрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИред
"рдЕрдкрдбреЗрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░" рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ $rootScope.$evalAsync рдХреЛ $rootScope.$applyAsync рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдЕрдВрддрд░ рддрдм рддрдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рддрдХ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ $digest рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддреЗред рдЬрдм AngularJS рдПрдХ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдХреЛрдк рдЯреНрд░реА рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ $watch() рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдФрд░ рдЧрдВрджрд╛ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЗ рджреМрд░рд╛рди, $applyAsync() рдХреНрдпреВ рдФрд░ $evalAsync() рдХреНрдпреВ рджреЛрдиреЛрдВ рдлрд╝реНрд▓рд╢ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ; рд▓реЗрдХрд┐рди, рдпрд╣ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╣реЛрддрд╛ рд╣реИред

$applyAsync() рдХрддрд╛рд░ рдХреЗрд╡рд▓ $digest рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╝реНрд▓рд╢ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ AngularJS рдЧрдВрджреЗ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдБрдЪ рд╢реБрд░реВ рдХрд░реЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, $applyAsync() рдХрддрд╛рд░ рдХреЛ $digest рдХреЗ рджреМрд░рд╛рди рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдПрдХ рдмрд╛рд░ рдлреНрд▓рд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдлрд╝реНрд▓рд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдХрддрд╛рд░ $digest рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреЙрдкреНрдпреБрд▓реЗрдЯ рд╣реЛ рдЧрдИ рд╣реЛред

рджреВрд╕рд░реА рдУрд░, $evalAsync() рдХрддрд╛рд░, рдЙрд╕ рд╕рдордп-рд▓реВрдк рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╝реНрд▓рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдЬреЛ $digest рдХреЗ рдЕрдВрджрд░ "рдбрд░реНрдЯреА рдЪреЗрдХ" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдХреЗ рджреМрд░рд╛рди $evalAsync() рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдХрд┐рд╕реА рднреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдЙрд╕реА рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдореЗрдВ рдмрд╛рдж рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдареЛрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ $evalAsync() рджреНрд╡рд╛рд░рд╛ $watch() рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рднреАрддрд░ рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЙрд╕реА рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВрдЧреЗред рдПрдХ $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
    });

рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдореИрдВ рдХреЛрдгреАрдп рдХреЛрдбрдмреЗрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рддрд░реНрдХ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ url(...) рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред href рддреБрд░рдВрдд рд╕рд╣реА URL рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЙрд╕реА рд░рди рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, $digest рд╕реНрдерд┐рд░реАрдХрд░рдг рдЪрдХреНрд░ рдХреЗ рднреАрддрд░, рдЗрд╕реЗ рдкреБрд░рд╛рдирд╛ URL рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рдкреИрдЪ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рд▓рдВрдмрд┐рддHref' рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╕реЗрдЯ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдорд╛рди рд╕реНрдерд╛рди.href рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓рдВрдмрд┐рдд рдорд╛рди рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпреВрдЖрд░рдПрд▓ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рджреМрд░рд╛рди, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП 0ms рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд╛рдЗрдорд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпреВрдЖрд░рдПрд▓() рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддрд░реНрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рджреЗрд░реА рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдгреАрдп рдЯреИрдЧ v1.4.3.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
рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдгреАрдп рдЯреАрдо рдХреЛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

@viattik рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЛрдгреАрдп рдЯреАрдо iOS9 рдкрд░ UIWebView рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЕрдкрдирд╛рдПрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдмрдЧ UIWebView (Apple) рдореЗрдВ рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рд╣рдореЗрд╢рд╛ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...

@raftheunis87
рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдЧ рд╣реИрдВ рдФрд░ рдХреЛрдгреАрдп рдХреЛрдб рдореЗрдВ рдЙрди рдмрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ UIWebView рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдкреНрд╕ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдирд╡реАрдирддрдо iOS рдореЗрдВ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдкреНрд╕ рдореЗрдВ рдХреЛрдгреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрдм рддрдХ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ Apple рдЙрд╕ рдмрдЧ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░ рджреЗрддрд╛ред рдФрд░ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рд╣реИред
рддреЛ рдореИрдВ рдЗрд╕реЗ рдПрдХ рдХреЛрд╢рд┐рд╢ рджреВрдВрдЧрд╛ред

@viattik рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдБред рдФрд░ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ: рдРрдкреНрдкрд▓ рдиреЗ рд╣рдореЗрдВ рдмрддрд╛рдпрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ UIWebView рдмрдЧ тАЛтАЛрдХреЛ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ: рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ ;-)

рджреЛрд╕реНрддреЛрдВ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╡реЗрдмрдХрд┐рдЯ рдмрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд░реЗрдкреНрд░реЛ рдХреЗрд╕ рдХреЗ рд╕рд╛рде, рддреЛ рдореИрдВ рд╡реЗрдмрдХрд┐рдЯ рдкрдХреНрд╖ рдкрд░ рд╣рдорд╛рд░реЗ рдХреБрдЫ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░реВрдВрдЧрд╛ред https://bugs.webkit.org/

@рдирд╛рдУрдореАрдмреНрд▓реИрдХ
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реЗрдмрдХрд┐рдЯ рдмрдЧ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ iOS9 рдкрд░ UIWebView рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред IOS9 рдкрд░ рд╕рдлрд╛рд░реА рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИред

@ raftheunis87 рдЖрдкрдХреЗ рдХреЛрдб рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛

@raftheunis87 @CleverCoder рдЖрдпрдирд┐рдХ-рдХреЛрдгреАрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

@abrahamrkj рдореБрдЭреЗ рдЖрдпрдирд┐рдХ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдпрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрдирдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛрдгреАрдп рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ? рдЕрдиреНрдпрдерд╛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд╣реА рдлрд┐рдХреНрд╕ рдЖрдпрдирд┐рдХ-рдХреЛрдгреАрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ ...

@ raftheunis87 https://github.com/driftyco/ionic/tree/master/js рдпрд╣ рд╡рд╣ рдХреЛрдгреАрдп рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП @CleverCoder +1ред рдореИрдВ @viattik рд╕реЗ рд╕рд╣рдордд

рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рдВрдХреЛрдЪ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдгреАрдп рдХреЛрдбрдмреЗрд╕ рдХреЗ рдХрд░реАрдм рдирд╣реАрдВ рд╣реВрдВред рдореИрдВ рдЬрд▓реНрдж рд╣реА рд╕рдорд╛рдзрд╛рди рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдмреБрд▓реЗрдЯ-рдкреНрд░реВрдл рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛ рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ред рд╕реНрдерд╛рди рд╡рд╕реНрддреБ 'рддреБрд░рдВрдд' рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рддрдм рддрдХ рдЯрд┐рдХрд╛ рд░рд╣рд╛ рдЬрдм рддрдХ 'рдкреЙрдкрд╕реНрдЯреЗрдЯ' рдФрд░ 'рд╣реИрд╢рдЪреЗрдВрдЬ' рдИрд╡реЗрдВрдЯ рд╣реБрдХ рдирд╣реАрдВ рдереЗ, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдердЧрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдХрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░.. рд╢рд╛рдпрдж рдЙрди рдШрдЯрдирд╛рдУрдВ рдХрд╛ рд╕рдордп рдмрджрд▓ рдЧрдпрд╛ рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣реА рджреЗрдЦ рд░рд╣рд╛ рдерд╛)ред
рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рджреЗрдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЕрдЧрд░ рдХреБрдЫ рднреА рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЕрдм рддрдХ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЙрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдЦреЛрджреВрдВрдЧрд╛, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдмреЗрд╣рддрд░ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдпрд╣ рднреНрд░рдорд┐рдд рд╣реИред рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдмрд╣реБрдд рдХреБрдЫ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрднреА рднреА рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред
рдЪреАрдпрд░реНрд╕!

... рдФрд░ рд╣рд╛рдБ, @borrull , рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдпрджрд┐ рдРрдкреНрдкрд▓ рдХреЛрдИ рдФрд░ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕рдордп рдмрдо рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдкреНрд░реЗрд╕ рдФрд░ рдЙрдВрдЧрд▓реА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛ред рдореИрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ (рдореИрдВ рдЗрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рддрд░реНрдХ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореВрд▓реНрдп рдмрджрд▓рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд╣рд╛рдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд░реЗрдЦрд╛? рд╣рдо рдХрд┐рди рдЕрдиреНрдп рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдпрд╣ рдПрдХ рдЕрдЬреАрдм рд╣реИред

@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 #

@ рдЬреЗрдбреА-рдХреИрд░реЛрд▓: рдпрд╣ рд╡рд╛рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдордп рд╣реЛрдиреЗ рдкрд░ рдореИрдВ рдЖрдЬ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЗрд╕ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╕рд╛рдорд╛рди рд╕реЗ рдХрд╛рдлреА рднрд░рд╛ рд╣реБрдЖред рдпрд╣ рд╕рд┐рд░реНрдл рдФрд░ рдЕрдзрд┐рдХ рд░рд╣рд╕реНрдп рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдерд╛рди рдореЗрдВ рджреЗрд░реА рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред * рдорд╛рди рдЕрдкрдбреЗрдЯ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

@realityfilter : рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ ... рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА

рд╣реЗ рд╕рдм,
рдореИрдВ рдмрд╕ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдлрд┐рдХреНрд╕ рдиреЗ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдмрдЧ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ред

рд╣рдорд╛рд░реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдВрдХрд░ рдЯреИрдЧ рдереЗ рдЬреЛ href="#" рдФрд░ ng-click="someCall()" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗред href рдЗрд╕ рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЗрдЯ рдХреЛ index.html рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ рд░рд╣рд╛ рдерд╛ред href рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред

рд╣рдорд╛рд░рд╛ рдРрдк рдЖрдпрдирд┐рдХ рдореЗрдВ рдмреИрдХ рдмрдЯрди рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЯреВрдЯ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рдирдП рджреГрд╢реНрдп рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рджреГрд╢реНрдп рдкрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдИрдУрдПрд╕ 9 рдмреАрдЯрд╛ рдкрд░ рдирдП рджреГрд╢реНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдпрдирд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд╕рдВрдХрд▓реНрдк

IOS 9 рдмреАрдЯрд╛ 5 13A4325c, рдХреЛрдгреАрдп 1.4.0 (рдХреЙрд░реНрдбреЛрд╡рд╛-рдЖрдИрдУрдПрд╕ 3.9.1 рдХреЗ рд╕рд╛рде) рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд UIWebView рдмрдЧ тАЛтАЛрдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛!

рдХреЛрдгреАрдп v1.2.27 . рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛

рдореИрдВрдиреЗ рдЗрд╕реЗ 1.2.27 рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрд╛ рд╣реИ, рдмрдЧ 1.2.26 рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдкреНрд░рддрд┐рдмрджреНрдз рдЕрдкрд░рд╛рдзреА рд╣реИред

@damrbaby рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреБрдЫ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рд╕рдлрд╛рд░реА рдореЗрдВ рдХреЛрдгреАрдп рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдИрдУрдПрд╕ 9 рдкрд░ uiWebView рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреЛрдгреАрдп рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдПрдХ рдмреБрд░реА рдЪреАрдЬ рд╣реИред

@CleverCoder @realityfilter @ jyc66 рдореИрдВ рд╕рд┐рд░реНрдл рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЖрдкрдиреЗ рдЕрднреА-рдЕрднреА рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рдпрд╛ред

рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА iOS9 GM Seed рдкрд░ рдореМрдЬреВрдж рд╣реИ рдЗрд╕рд▓рд┐рдП рдЕрдкрдиреЗ рдРрдкреНрд╕ рдХреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рд╡рд╛рдПрдВ!

рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА iOS9 GM (13A340) рдореЗрдВ рдореМрдЬреВрдж рд╣реИ

рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Apple рдиреЗ рдХреБрдЫ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдРрдкреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдпрд╛ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдирд╣реАрдВ рдмрджрд▓реЗ рд╣реИрдВ) рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ :(ред рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдИрдУрдПрд╕ 9 рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдРрдкреНрдкрд▓ рдХреЛ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред рдкреБрд░рд╛рдиреЗ рдРрдк рдореЗрдВ рдирд╡реАрдирддрдо рдПрдВрдЧреБрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рднреА рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреАред

рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреЛрдгреАрдп рдПрдХрдорд╛рддреНрд░ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ iOS9 рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рддреЛ, рдЖрдпреЛрдирд┐рдХ рдЯреАрдо рд╕реЗ @adamdbradley , @perrygovier , рдФрд░ @mhartington рдкреВрд░реЗ рджрд┐рди рдПрдХ рдлрд┐рдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ Ionic рдФрд░ рд╕рд╛рджреЗ рдХреЛрдгреАрдп рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд▓рдХреНрд╖реНрдп рдПрдХ рдбреНрд░реЙрдк-рдЗрди рдлрд┐рдХреНрд╕ рд╣реЛрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдгреАрдп рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ (рдЙрдореНрдореАрдж рд╣реИ) рдЕрдзрд┐рдХрд╛рдВрд╢ 1.2+ рдХреЛрдгреАрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдмрдВрдбрд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдЗрд╕ рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ $browser рдХреЛ рд╕рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдиреЛрдЯ: рдпрд╣ рдХреЛрдгреАрдп 1.4.3 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдХреЛрдгреАрдп рдЙрдЪрд┐рдд рд╕реЗ browser.js "рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрди" рдХреА рддрд░рд╣ рд╣реИ: https://github.com/driftyco/ionic/blob/ios9-patch/js /angular/service/decorators/ios9-browser-fix.js

рд╣рдордиреЗ рдкреИрдЪ рдХреЛ рдЕрдкрдиреЗ рд╕реАрдбреАрдПрди рдкрд░ рднреА рд░рдЦрд╛ рд╣реИред рдореИрдВ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕реАрдбреАрдПрди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рдпрд╣ рдХреЗрд╡рд▓ рд╡рд╣рд╛рдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЕрднреА рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдХреЛ рдЕрдкрдиреА рдХреЛрдгреАрдп рдпрд╛ ionic.bundle.js рдлрд╝рд╛рдЗрд▓ рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ:

<script src="https://code.ionicframework.com/patch/ios9-$browser-patch.js"></script>

рд╕рд╛рде рд╣реА, рдЕрднреА рдпрд╣ рдкреИрдЪ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк iOS9 рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдЗрд╕ рддрд░рд╣ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ iOS 9 UIWebView рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдпрдирд┐рдХ рдореБрджреНрджреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ: https://github.com/driftyco/ionic/issues/4082#issuecomment -139079725

рдирдорд╕реНрддреЗ,

UI-sref рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди $state.go рдмреИрдХ рдмрдЯрди рдПрдиреАрдореЗрд╢рди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ
рдФрд░ рдЗрд╕ рд╕реБрдзрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдкреГрд╖реНрда рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рджрд░,
рдЕрдЬрдп рд╕рд┐рдВрд╣

рдЧреБрд░реБ, 10 рд╕рд┐рддрдВрдмрд░, 2015 рдХреЛ рд╕реБрдмрд╣ 6:23 рдмрдЬреЗ рдореИрдХреНрд╕ рд▓рд┐рдВрдЪ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рддреЛ, @adamdbradley https://github.com/adamdbradley , @perrygovier
https://github.com/perrygovier , рдФрд░ @mhartington
https://github.com/mhartington рдЖрдпреЛрдирд┐рдХ рдЯреАрдо рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ
рдкреВрд░реЗ рджрд┐рди рдПрдХ рдлрд┐рдХреНрд╕ рдкрд░ рдЬреЛ рдЖрдпреЛрдирд┐рдХ рдФрд░ рд╕рд╛рджреЗ рдХреЛрдгреАрдп рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛:
рдХреБрдВрдЖред рд▓рдХреНрд╖реНрдп рдПрдХ рдбреНрд░реЙрдк-рдЗрди рдлрд┐рдХреНрд╕ рд╣реЛрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдХреЛрдгреАрдп, рдФрд░ рд╡рд┐рд▓ (рдЙрдореНрдореАрдж рд╣реИ) рдЕрдзрд┐рдХрд╛рдВрд╢ 1.2+ рдХреЛрдгреАрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдмрдВрдбрд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ $рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╕рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдареАрдХ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
https://github.com/angular/angular.js/issues/12241#issuecomment -130744518ред
рдиреЛрдЯ: рдпрд╣ рдХреЛрдгреАрдп рез.рек.рей рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрди" рд╣реИ
рдмреНрд░рд╛рдЙрдЬрд╝рд░.рдЬреЗрдПрд╕ рдХреЛрдгреАрдп рд╕реЗ рдЙрдЪрд┐рдд:
https://github.com/driftyco/ionic/blob/ios9-patch/js/angular/service/decorators/ios9-browser-fix.js

рд╣рдордиреЗ рдкреИрдЪ рдХреЛ рдЕрдкрдиреЗ рд╕реАрдбреАрдПрди рдкрд░ рднреА рд░рдЦрд╛ рд╣реИред рдореИрдВ рд╕реАрдбреАрдПрди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛
рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рд╡рд╣рд╛рдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЕрднреА рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдХреГрдкрдпрд╛ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдФрд░ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдгреАрдп рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ рдпрд╛
рдЖрдпрдирд┐рдХ.рдмрдВрдбрд▓.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓:

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

cmplank picture cmplank  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jetta20162 picture jetta20162  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gkalpak picture gkalpak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

guyandtheworld picture guyandtheworld  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ashclarke picture ashclarke  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ