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を使用していますが、これは必須ですか?
この問題に関する助けに感謝します!
UIWebView
は引き続き既存のアプリで動作します。 WKWebView
はiOS8
から利用可能です。WKWebView
のみがNitro JavaScriptエンジンを備えています。
古いアプリでこの高速なJavaScriptエンジンを利用するには、WKWebView
の代わりにUIWebView
を使用するようにコードを変更する必要があります。 iOS7
以前の場合、UIWebView
を引き続き使用する必要があるため、iOS8
を確認してからWKWebView
メソッド/デリゲートメソッドを適用し、UIWebView
iOS7
以前のメソッド。また、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サイトを開くために使用できます。パフォーマンスを比較し、WKWebView
: https://iTunes.Apple.com/app/id928647773?mt=8&at=10ltWQ
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
ステップ: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>
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にし、必要なメソッドを作成しました。
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()
}
}
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()
}
}
いくつかのデザインパターンを使用すると、UIWebViewとWKWebViewを混在させることができます。重要なポイントは、独自のブラウザーインターフェイスを設計することです。ただし、アプリの現在の機能にもっと注意を払う必要があります。たとえば、NSURLProtocolを使用してネットワーク機能を強化している場合、WKWebViewを使用して同じことを行う機会はありません。 NSURLProtocolは現在のプロセスと、マルチプロセスアーキテクチャを使用するWKWebViewのみに影響するため、ネットワーキングスタッフは別のプロセスにいます。
WKWebViewを使用する必要があります。これは、フレームワーク「WebKit」でiOS8の時点で利用可能であり、高速化を実現します。後方互換性が必要な場合は、iOS7以前のUIWebViewを使用する必要があります。
新しいWKWebViewのUIViewControllerフレームを提供する小さなコードをセットアップしました。ココアポッド経由でインストールできます。こちらをご覧ください:
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)