我试图了解如何在iOS8中使用新的WKWebView,找不到太多信息。我读过:
http://developer.telerik.com/featured/why-ios-8s-wkwebview-is-a-big-deal-for-hybrid-development/ http://nshipster.com/wkwebkit/
但这对现有应用有何影响?普通的UiWebView会从nitro java脚本引擎获得加速,还是需要进行更改?我们如何处理向后兼容性?
我能找到的所有代码和示例都使用swift,这是强制性的吗?
感谢您对此事的任何帮助!
答案 0 :(得分:54)
UIWebView
仍会继续使用现有应用。从WKWebView
开始提供iOS8
,只有WKWebView
有一个Nitro JavaScript引擎。
要在较旧的应用中利用此更快的JavaScript引擎,您必须更改代码才能使用WKWebView
而不是UIWebView
。对于iOS7
及更早版本,您必须继续使用UIWebView
,因此您可能需要检查iOS8
,然后应用WKWebView
方法/委托方法并回退到{{ 1}} UIWebView
及更早版本的方法。此外,iOS7
(还)没有Interface Builder组件,因此您必须以编程方式实现WKWebView
。
您可以在Objective-C中实现WKWebView
,这是启动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];
渲染性能在WebGL游戏中很明显,并且运行复杂的JavaScript算法,如果您使用webview加载简单的html或网站,则可以继续使用WKWebView
。
以下是一个测试app,可用于使用UIWebView
或UIWebView
打开任何网站,您可以比较效果,然后决定升级您的应用以使用{{1 }}:
https://itunes.apple.com/app/id928647773?mt=8&at=10ltWQ
答案 1 :(得分:35)
以下是我从 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
答案 2 :(得分:16)
步骤:1 在webkit
ViewController.swift
import WebKit
Step: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>
答案 3 :(得分:10)
Swift不是必需的,一切都适用于Objective-C。 UIWebView将继续受到支持,因此如果您想花时间,不要急于迁移。但是,它不会获得WKWebView的javascript和滚动性能增强。
为了向后兼容,我的视图控制器有两个属性:UIWebView和WKWebView。只有当类存在时才使用WKWebview:
if ([WKWebView class]) {
// do new webview stuff
} else {
// do old webview stuff
}
虽然我曾经有一个UIWebViewDelegate,但我也把它变成了WKNavigationDelegate并创建了必要的方法。
答案 4 :(得分:7)
根据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()
}
}
答案 5 :(得分:5)
在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()
}
}
答案 6 :(得分:2)
使用一些设计模式,可以混合使用UIWebView和WKWebView。 关键是要设计一个独特的浏览器界面。 但是你应该更加关注应用程序的当前功能, 例如:如果您的应用程序使用NSURLProtocol来增强网络能力,使用WKWebView您就没有机会做同样的事情。由于NSURLProtocol仅影响当前进程,而WKWebView使用多进程架构,因此网络人员处于单独的过程中。
答案 7 :(得分:1)
你必须使用WKWebView,它可以在Framework&#39; WebKit&#39;中使用。获得加速。 如果您需要向后兼容性,则必须使用适用于iOS7及更早版本的UIWebView。
我设置了一些代码来为新的WKWebView提供UIViewController框架。它可以通过cocoapods安装。看看这里:
答案 8 :(得分:0)
Swift 4
private async Task SignIn(string username)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username)
};
// TODO: get roles from external source
claims.Add(new Claim(ClaimTypes.Role, "Admin"));
claims.Add(new Claim(ClaimTypes.Role, "Moderator"));
var identity = new ClaimsIdentity(
claims,
CookieAuthenticationDefaults.AuthenticationScheme,
ClaimTypes.Name,
ClaimTypes.Role
);
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(identity),
new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTime.UtcNow.AddMonths(1)
}
);
}