attribute - Ejecución WKWebKit javascript cuando no está conectado a una jerarquía de vista



html title style (1)

Habiendo tropezado con el mismo problema, nunca encontré ninguna solución excepto para agregar WKWebView a la jerarquía de vistas y moverlo fuera de pantalla con AutoLayout. Afortunadamente, esta solución alternativa funciona de manera confiable.

https://ffff65535.com

Quiero cambiar a WKWebView desde UIWebView . En mi código, la instancia de la vista web se crea fuera de la pantalla (sin asociarla a la jerarquía de vistas) y se carga la URL. Cuando se realiza la carga, la vista web se presenta al usuario en una ventana UI separada (como un anuncio intersticial). Todo funciona bien con UIWebView ; pero después de cambiar a WKWebView , el código angular javascript se comporta de una manera inesperada.

Después de investigar un poco, me he dado cuenta de que los javascript timers (y los cargadores HTTP) están suspendidos cuando la instancia de WKWebView no está conectada a la jerarquía de la vista: si inicia un temporizador en javascript que se ejecuta en WKWebView separado, no será disparado hasta que se adjunta la vista web.

¿Alguien puede sugerir una posible solución alternativa (además de adjuntar una vista web oculta a la ventana clave y luego moverla a otra ventana)?

Creé un proyecto de muestra para demostrar el problema (o, más probablemente, una función de WebKit)

https://dl.dropboxusercontent.com/u/148568148/WebKitViewTest.zip

La aplicación de prueba carga una página web con javascript que programa un temporizador y carga una solicitud HTTP. Puede usar los interruptores para mostrar / ocultar la vista web (establece la propiedad "oculta") y adjuntar / separar de la jerarquía de la vista.

Si la vista web está adjunta (oculta o visible) y presiona Load , la javascript funciona bien: puede ver el diálogo de alerta de success o failure . Si está desconectado, el temporizador solo se activará cuando esté conectado a la jerarquía de visualización (cambie "Desactivado" a "activado", presione "Cargar", espere unos segundos y vuelva a "apagado"). También puede consultar console.log desde Safari Web Inspector.

Aquí está la fuente de la página web de prueba:

<!doctype html>
<html ng-app="project">
  <head>
    <script
      src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.js"></script>
    <script src="project.js"></script>
  </head>
  <body>
    <div id="simple" ng-controller="MyController" data-ng-init="callNotify(message);">
    </div>
  </body>
</html>

Y el javascript:

angular.
  module('project', []).
  controller('MyController', ['$scope','notify', function ($scope, notify) {
  $scope.callNotify = function(msg) {
    notify(msg);
  };
}]).
  factory('notify', ['$window', '$http', '$q', '$timeout', function(win, $http, $q, $timeout) {
  return function(msg) {
    deferred = $q.defer();

    $timeout(function() {
      $http.get('http://jsonplaceholder.typicode.com/posts').
      success(function(data, status, headers, config) {
        alert("success");
        console.log("success")
      }).
        error(function(data, status, headers, config) {
        alert("error");
        console.log("error")
      });
    });
    return deferred.promise;
  };
}]);




wkwebview