WKWebKit JavaScript未连接到视图层次结构时执行

我想从UIWebView切换到WKWebView 。 在我的代码中,网页视图实例是在屏幕外创build的(没有附加到视图层次结构),并加载了URL。 加载完成后,网页视图会在单独的UIWindow中呈现给用户(如插页式广告)。 一切工作正常与UIWebView ; 但切换到WKWebView ,angular度的JavaScript代码行为意想不到的方式。

在做了一些研究之后,我发现当WKWebView实例没有附加到视图层次结构时,javascript定时器(和http加载器)被挂起:如果你启动了一个在分离的WKWebView中运行的javascript定时器 – 它不会直到Web视图被附加。

任何人都可以build议一个可能的解决方法(除了附加一个隐藏的Web视图的关键窗口,然后将其移动到另一个窗口)?

我已经创build了一个示例项目来演示这个问题(或者更可能是WebKitfunction)

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

testing应用程序加载一个JavaScript的网页调度计时器和加载http请求。 您可以使用开关来显示/隐藏Web视图(设置“隐藏”属性),并将其从视图层次结构中附加/分离。

在iOS 8.0上运行示例应用程序

如果Web视图被附加(隐藏或可见),并且您点击Load ,那么JavaScript工作正常:您可以看到successfailure警报对话框。 如果它被分离 – 定时器只会在附加到视图层次结构时触发(将“Detached”切换到“on”,点击“Load”,等待几秒钟,然后切换回“off”)。 您也可以从Safari Web Inspector中检查console.log

以下是testing网页源代码:

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

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