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!
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
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
É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>
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.
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()
}
}
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()
}
}
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é.
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:
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)