web-dev-qa-db-ja.com

WKWebViewに移行する方法は?

IOS8で新しいWKWebViewを使用する方法を理解しようとしていますが、多くの情報が見つかりません。もう読んだ:

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

しかし、これは既存のアプリにどのように影響しますか?通常のUiWebViewは、ニトロJavaスクリプトエンジンから高速化を実現しますか、それとも変更を加える必要がありますか?後方互換性にどのように対処しますか?

私が見つけることができるすべてのコードと例はSwiftを使用していますが、これは必須ですか?

この問題に関する助けに感謝します!

57
Daniel Åkesson

UIWebViewは引き続き既存のアプリで動作します。 WKWebViewiOS8から利用可能です。WKWebViewのみがNitro JavaScriptエンジンを備えています。

古いアプリでこの高速なJavaScriptエンジンを利用するには、WKWebViewの代わりにUIWebViewを使用するようにコードを変更する必要があります。 iOS7以前の場合、UIWebViewを引き続き使用する必要があるため、iOS8を確認してからWKWebViewメソッド/デリゲートメソッドを適用し、UIWebViewiOS7以前のメソッド。また、WKWebView(まだ)用のInterface Builderコンポーネントがないため、プログラムでWKWebViewを実装する必要があります。

Objective-CでWKWebViewを実装できます。これは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レンダリングパフォーマンスはWebGLゲームや複雑なJavaScriptアルゴリズムを実行するもので顕著です。webviewを使用して単純なhtmlまたはWebサイトをロードする場合、UIWebViewを引き続き使用できます。

ここにテストがあります app これはUIWebViewまたはWKWebViewのいずれかを使用して任意のWebサイトを開くために使用できます。パフォーマンスを比較し、WKWebViewhttps://iTunes.Apple.com/app/id928647773?mt=8&at=10ltWQ

enter image description here

57
krisrak

IWebViewからWKWebViewに移行した方法を次に示します。

注:ストーリーボードにドラッグできるUIWebViewのようなプロパティはありません。プログラムで行う必要があります。

必ずWebKit/WebKit.hをヘッダーファイルにインポートしてください。

これは私のヘッダーファイルです。

#import <WebKit/WebKit.h>

@interface ViewController : UIViewController

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

@end

実装ファイルは次のとおりです。

#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

ステップ:1webkit in ViewController.Swift

import WebKit

Step:2 webViewの変数を宣言します。

var webView : WKWebView!

Step:3WKNavigationDelegateのデリゲートを追加

class ViewController: UIViewController , WKNavigationDelegate{

ステップ:4ViewDidLoadにコードを追加します。

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)

ステップ:5info.plistの追加を編集

<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は必須ではなく、Objective-Cですべてが正常に機能します。 UIWebViewは引き続きサポートされるため、時間をかけたい場合に移行するラッシュはありません。ただし、WKWebViewのJavaScriptおよびスクロールパフォーマンスの強化は提供されません。

後方互換性のために、View ControllerにはUIWebViewとWKWebViewの2つのプロパティがあります。クラスが存在する場合にのみ、WKWebviewを使用します。

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

以前はUIWebViewDelegateを使用していましたが、これをWKNavigationDelegateにし、必要なメソッドを作成しました。

10
weiyin

Apple docs によれば、WkWebViewはUIWebviewよりもはるかに高速で信頼性があります。ここに、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

IOS 8.でSwiftを使用したWKWebView。

ViewController.Swiftファイル全体は次のようになります。

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

いくつかのデザインパターンを使用すると、UIWebViewとWKWebViewを混在させることができます。重要なポイントは、独自のブラウザーインターフェイスを設計することです。ただし、アプリの現在の機能にもっと注意を払う必要があります。たとえば、NSURLProtocolを使用してネットワーク機能を強化している場合、WKWebViewを使用して同じことを行う機会はありません。 NSURLProtocolは現在のプロセスと、マルチプロセスアーキテクチャを使用するWKWebViewのみに影響するため、ネットワーキングスタッフは別のプロセスにいます。

2
Proteas

WKWebViewを使用する必要があります。これは、フレームワーク「WebKit」でiOS8の時点で利用可能であり、高速化を実現します。後方互換性が必要な場合は、iOS7以前のUIWebViewを使用する必要があります。

新しいWKWebViewのUIViewControllerフレームを提供する小さなコードをセットアップしました。ココアポッド経由でインストールできます。こちらをご覧ください:

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