Подтвердить что ты не робот

Как перейти на WKWebView?

Я пытаюсь понять, как использовать новый WKWebView в iOS8, не может найти много информации. Я читал:

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

Но как это влияет на существующие приложения? Будет ли обычный UiWebView получить ускорение от нитро java script или нам нужно внести изменения? Как мы имеем дело с обратной совместимостью?

Весь код и примеры, которые я могу найти, используют swift, это будет обязательным?

Спасибо за любую помощь по этому вопросу!

4b9b3361

Ответ 1

UIWebView по-прежнему будет работать с существующими приложениями. WKWebView доступен начиная с iOS8, только WKWebView имеет движок Nitro JavaScript.

Чтобы воспользоваться этим более быстрым движком JavaScript в старых приложениях, вам нужно внести изменения в код, чтобы использовать WKWebView вместо UIWebView. Для iOS7 и старше вы должны продолжать использовать UIWebView, поэтому вам может потребоваться проверить iOS8, а затем применить методы/методы делегата WKWebView и вернуться к методам UIWebView для iOS7 и старше, Также нет компонента Interface Builder для WKWebView (пока), поэтому вам необходимо программно реализовать WKWebView.

Вы можете реализовать WKWebView в Objective-C, вот простой пример для запуска 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 или веб-сайта, вы можете продолжать использовать UIWebView.

Вот тест app, который может использоваться для открытия любого веб-сайта с помощью UIWebView или WKWebView, и вы можете сравнить производительность, а затем решите обновить приложение, чтобы использовать WKWebView: https://itunes.apple.com/app/id928647773?mt=8&at=10ltWQ

enter image description here

Ответ 2

Вот как я перешел из UIWebView в 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

Ответ 3

Шаг: 1 Импортируйте webkit в ViewController.swift

import WebKit

Шаг: 2 Объявите переменную webView.

var webView : WKWebView!

Шаг: 3 Добавление делегата WKNavigationDelegate

class ViewController: UIViewController , WKNavigationDelegate{

Шаг: 4 Добавление кода в 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)

Шаг: 5 Редактировать добавление info.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>

Ответ 4

Swift не является обязательным требованием, все работает отлично с Objective-C. UIWebView будет по-прежнему поддерживаться, поэтому не нужно спешить с переносом, если вы хотите потратить свое время. Тем не менее, он не получит улучшений Javascript и прокрутки WKWebView.

Для обратной совместимости у меня есть два свойства для моего контроллера: UIWebView и WKWebView. Я использую WKWebview только в том случае, если класс существует:

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

В то время как у меня был UIWebViewDelegate, я также сделал его WKNavigationDelegate и создал необходимые методы.

Ответ 5

WkWebView намного быстрее и надежнее, чем UIWebview в соответствии с Apple docs. Здесь я разместил свой 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()
    }

}

Ответ 6

WKWebView с использованием Swift в iOS 8..

Весь файл 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()
    }

}

Ответ 7

Используйте некоторые шаблоны проектирования, вы можете смешивать UIWebView и WKWebView. Ключевым моментом является создание уникального интерфейса браузера. Но вы должны уделять больше внимания текущей функциональности вашего приложения, например: если ваше приложение использует NSURLProtocol для повышения способности сети, используя WKWebView, у вас нет шансов сделать то же самое. Поскольку NSURLProtocol влияет только на текущий процесс, а WKWebView использует архитектуру многоуровневого процесса, сетевой персонал находится в отдельном процессе.

Ответ 8

Вам нужно использовать WKWebView, который доступен в iOS8 в Framework 'WebKit', чтобы получить ускорение. Если вам нужна обратная совместимость, вы должны использовать UIWebView для iOS7 и старше.

Я установил небольшой код, чтобы обеспечить кадр UIViewController для нового WKWebView. Он может быть установлен через cocoapods. Посмотрите здесь:

STKWebKitViewController on github

Ответ 9

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)