web-dev-qa-db-fra.com

Comment migrer vers WKWebView?

J'essaie de comprendre comment utiliser le nouveau WKWebView dans iOS8, je ne peux pas trouver beaucoup d'informations. J'ai lu:

http://developer.telerik.com/featured/why-ios-8s-wkwebview-is-a-big-deal-for-hybrid-development/http: // nshipster .com/wkwebkit /

Mais comment cela affecte les applications existantes? Un UiWebView ordinaire obtiendra-t-il l'accélération du moteur de script nitro Java ou devons-nous apporter des modifications? Comment gérons-nous la rétrocompatibilité?

Tous les codes et exemples que je peux trouver utilisent Swift, sera-t-il obligatoire?

Reconnaissant pour toute aide sur cette question!

57
Daniel Åkesson

UIWebView continuera de fonctionner avec les applications existantes. WKWebView est disponible à partir de iOS8, seul WKWebView a un moteur JavaScript Nitro.

Pour tirer parti de ce moteur JavaScript plus rapide dans les anciennes applications, vous devez modifier le code pour utiliser WKWebView au lieu de UIWebView. Pour iOS7 et plus, vous devez continuer à utiliser UIWebView, vous devrez donc peut-être vérifier pour iOS8 puis appliquez WKWebView méthodes/méthodes déléguées et repliez-vous sur UIWebView méthodes pour iOS7 et plus. De plus, il n'y a pas de composant Interface Builder pour WKWebView (pour le moment), vous devez donc implémenter par programme WKWebView.

Vous pouvez implémenter WKWebView dans Objective-C, voici un exemple simple pour lancer un WKWebView:

WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
webView.navigationDelegate = self;
NSURL *nsurl=[NSURL URLWithString:@"http://www.Apple.com"];
NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
[webView loadRequest:nsrequest];
[self.view addSubview:webView];

WKWebView les performances de rendu sont perceptibles dans les jeux WebGL et quelque chose qui exécute des algorithmes JavaScript complexes, si vous utilisez Webview pour charger un simple langage HTML ou un site Web, vous pouvez continuer à utiliser UIWebView.

Voici un test app pouvant ouvrir n'importe quel site Web à l'aide de UIWebView ou WKWebView. Vous pouvez comparer les performances, puis décider de mettre à niveau votre application pour qu'elle utilise WKWebView: https://iTunes.Apple.com/app/id928647773?mt=8&at=10ltWQ

enter image description here

57
krisrak

Voici comment je suis passé de IWebView à WKWebView.

Remarque: vous ne pouvez faire glisser aucune propriété comme UIWebView sur votre story-board, vous devez le faire par programme.

Assurez-vous d'importer WebKit/WebKit.h dans votre fichier d'en-tête.

Ceci est mon fichier d'en-tête:

#import <WebKit/WebKit.h>

@interface ViewController : UIViewController

@property(strong,nonatomic) WKWebView *webView;
@property (strong, nonatomic) NSString *productURL;

@end

Voici mon fichier d'implémentation:

#import "ViewController.h"

@interface ViewController ()

@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.productURL = @"http://www.URL YOU WANT TO VIEW GOES HERE";

    NSURL *url = [NSURL URLWithString:self.productURL];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    _webView = [[WKWebView alloc] initWithFrame:self.view.frame];  
    [_webView loadRequest:request];
    _webView.frame = CGRectMake(self.view.frame.Origin.x,self.view.frame.Origin.y, self.view.frame.size.width, self.view.frame.size.height);
    [self.view addSubview:_webView];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
36
Ali

Étape: 1 Importer webkit dans ViewController.Swift

import WebKit

Étape: 2 Déclarez une variable de webView.

var webView : WKWebView!

Étape: 3 Ajout du délégué de WKNavigationDelegate

class ViewController: UIViewController , WKNavigationDelegate{

Étape: 4 Ajout de code dans ViewDidLoad.

let myBlog = "https://iosdevcenters.blogspot.com/"
let url = NSURL(string: myBlog)
let request = NSURLRequest(URL: url!)

// init and load request in webview.
webView = WKWebView(frame: self.view.frame)
webView.navigationDelegate = self
webView.loadRequest(request)
self.view.addSubview(webView)
self.view.sendSubviewToBack(webView)

Étape: 5 Éditez le info.plist ajouter

<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>google.com</key>
<dict>
    <key>NSExceptionAllowsInsecureHTTPLoads</key>
    <true/>
    <key>NSIncludesSubdomains</key>
    <true/>
</dict>
</dict>
16
Kirit Modi

Swift n'est pas une nécessité, tout fonctionne bien avec Objective-C. UIWebView continuera à être pris en charge, il n'y a donc aucune hâte à migrer si vous souhaitez prendre votre temps. Cependant, il ne bénéficiera pas des améliorations de performance de JavaScript et de défilement de WKWebView.

Pour la compatibilité ascendante, j'ai deux propriétés pour mon contrôleur de vue: un UIWebView et un WKWebView. J'utilise WKWebview uniquement si la classe existe:

if ([WKWebView class]) {
    // do new webview stuff
} else {
    // do old webview stuff
}

Alors que j'avais l'habitude d'avoir un UIWebViewDelegate, je l'ai également fait un WKNavigationDelegate et créé les méthodes nécessaires.

10
weiyin

WkWebView est beaucoup plus rapide et fiable que UIWebview selon docs Apple . Ici, j'ai posté mon WkWebViewController.

import UIKit
import WebKit

class WebPageViewController: UIViewController,UINavigationControllerDelegate,UINavigationBarDelegate,WKNavigationDelegate{

    var webView: WKWebView?
    var webUrl="http://www.nike.com"

    override func viewWillAppear(animated: Bool){
        super.viewWillAppear(true)
        navigationController!.navigationBar.hidden = false

    }
    override func viewDidLoad()
    {
        /* Create our preferences on how the web page should be loaded */
        let preferences = WKPreferences()
        preferences.javaScriptEnabled = false

        /* Create a configuration for our preferences */
        let configuration = WKWebViewConfiguration()
        configuration.preferences = preferences

        /* Now instantiate the web view */
        webView = WKWebView(frame: view.bounds, configuration: configuration)

        if let theWebView = webView{
            /* Load a web page into our web view */
            let url = NSURL(string: self.webUrl)
            let urlRequest = NSURLRequest(URL: url!)
            theWebView.loadRequest(urlRequest)
            theWebView.navigationDelegate = self
            view.addSubview(theWebView)

        }


    }
    /* Start the network activity indicator when the web view is loading */
    func webView(webView: WKWebView,didStartProvisionalNavigation navigation: WKNavigation){
            UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    }

    /* Stop the network activity indicator when the loading finishes */
    func webView(webView: WKWebView,didFinishNavigation navigation: WKNavigation){
            UIApplication.sharedApplication().networkActivityIndicatorVisible = false
    }

    func webView(webView: WKWebView,
        decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse,decisionHandler: ((WKNavigationResponsePolicy) -> Void)){
            //print(navigationResponse.response.MIMEType)
            decisionHandler(.Allow)

    }
    override func didReceiveMemoryWarning(){
        super.didReceiveMemoryWarning()
    }

}
7
Chetan Dobariya

WKWebView utilisant Swift sous iOS 8 ..

L'ensemble du fichier ViewController.Swift ressemble maintenant à ceci:

import UIKit
import WebKit

class ViewController: UIViewController {

    @IBOutlet var containerView : UIView! = nil
    var webView: WKWebView?

    override func loadView() {
        super.loadView()

        self.webView = WKWebView()
        self.view = self.webView!
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        var url = NSURL(string:"http://www.kinderas.com/")
        var req = NSURLRequest(URL:url)
        self.webView!.loadRequest(req)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
5
Prasath

Utilisez des modèles de conception, vous pouvez mélanger UIWebView et WKWebView. L’important est de concevoir une interface de navigateur unique. Mais vous devriez accorder plus d’attention à la fonctionnalité actuelle de votre application, par exemple: si votre application utilise NSURLProtocol pour améliorer la capacité du réseau, utilisez WKWebView, vous n’avez aucune chance de faire la même chose. Comme NSURLProtocol affecte uniquement le processus en cours et WKWebView utilisant une architecture multi-processus, le personnel de la mise en réseau se trouve dans un processus séparé.

2
Proteas

Vous devez utiliser WKWebView, qui est disponible à partir de iOS8 dans Framework 'WebKit' pour accélérer le processus. Si vous avez besoin d'une compatibilité ascendante, vous devez utiliser UIWebView pour iOS7 et les versions antérieures.

J'ai configuré un petit code pour fournir le cadre UIViewController au nouveau WKWebView. Il peut être installé via des cocoapodes. Regardez ici:

STKWebKitViewController on github

1
stk

Swift 4

    let webView = WKWebView()   // Set Frame as per requirment, I am leaving it for you
    let url = URL(string: "http://www.google.com")!
    webView.load(URLRequest(url: url))
    view.addSubview(webView)
0
Madan gupta