Pertanyaan Eksekusi javascript WKWebKit bila tidak dilampirkan ke hierarki tampilan


Saya ingin beralih ke WKWebView dari UIWebView. Dalam kode saya, contoh tampilan web dibuat di luar layar (tanpa melekat pada hierarki tampilan) dan URL dimuat. Saat pemuatan selesai, tampilan web disajikan kepada pengguna di UIWindow yang terpisah (seperti iklan interstisial). Semuanya berfungsi dengan baik UIWebView; tetapi setelah beralih ke WKWebView, kode javascript sudut berperilaku dengan cara yang tidak terduga.

Setelah melakukan beberapa penelitian, saya sudah tahu bahwa timer javascript (dan loader HTTP) ditangguhkan ketika WKWebView contoh tidak dilekatkan pada hierarki tampilan: jika Anda memulai pengatur waktu dalam javascript yang berjalan di terlepas WKWebView - tidak akan diaktifkan hingga tampilan web dilampirkan.

Adakah yang bisa menyarankan solusi yang mungkin (selain melampirkan tampilan web yang tersembunyi ke jendela kunci dan kemudian memindahkannya ke jendela lain)?

Saya telah membuat proyek contoh untuk menunjukkan masalah (atau, lebih mungkin, fitur WebKit)

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

Aplikasi tes memuat halaman web dengan javascript yang menjadwalkan pengatur waktu dan memuat permintaan HTTP. Anda dapat menggunakan switch untuk menampilkan / menyembunyikan tampilan web (menyetel properti 'tersembunyi') dan melampirkan / melepaskannya dari hierarki tampilan.

Sample app running on iOS 8.0

Jika tampilan web dilampirkan (tersembunyi atau terlihat) dan Anda menekan Load, javascript berfungsi dengan baik: Anda dapat melihat success atau failure dialog peringatan. Jika terlepas - penghitung waktu hanya akan diaktifkan ketika terpasang ke hierarki tampilan (beralih "Terpisah" ke "aktif", tekan "Muat", tunggu beberapa detik dan kembali ke "nonaktif"). Anda juga bisa memeriksanya console.log dari Safari Web Inspector.

Berikut adalah sumber laman uji coba:

<!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>

Dan 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;
  };
}]);

32
2017-07-01 19:20


asal


Jawaban:


Setelah mengalami masalah yang sama, saya tidak pernah menemukan solusi apa pun kecuali menambahkan WKWebView ke hierarki tampilan dan memindahkannya ke layar dengan AutoLayout. Untungnya, solusi ini bekerja dengan andal.


1
2018-03-18 17:08