分享

UIWebView

 萤火与皓月 2016-08-23
目录
    1.1 加载某个网页
    1.2 设置ua
    1.3 获取标题
    1.4 获取当前页面URL
    1.5 清除页面缓存
    1.6 停止加载
    1.7 获取Scheme
    1.8 返回添加关闭按钮
    1.9 检测页面上的电话
    1.10 webView 禁止滚动
    1.11 获取HTML高度
    1.12 js调用oc方法
    1.13 oc调用js方法
1.1 加载页面

1.加载某个URL

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString:self.url]];

self.webView.scalesPageToFit = YES;

[self.webView loadRequest:request];


2.加载本地文件

NSURL* url = [NSURL fileURLWithPath:filePath]; // 需要加载的文件路径

NSURLRequest* request = [NSURLRequest requestWithURL:url];

[webView loadRequest:request];
1.2 设置ua

//通过ua,可以区分哪个应用访问了当前网页。
//需求:移动端隐藏H5顶部状态栏,使用原生的NavgationBar,PC端正常显示。

NSString *userAgent = [self.webView stringByEvaluatingJavaScriptFromString:
@"navigator.userAgent"];

NSString *executableFile = @"xxxx"; 

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:
(NSString *)kCFBundleVersionKey];

NSString *ua = [NSString stringWithFormat:@"%@ %@ %@", executableFile,
 version,userAgent];

[[NSUserDefaults standardUserDefaults] 
registerDefaults:@{@"UserAgent" : ua, @"User-Agent" : ua}];
1.3 获取标题

self.webTitle = [webView stringByEvaluatingJavaScriptFromString:
@"document.title"];

[self setNavigationItemTitle:self.webTitle];
1.4 获取当前页面URL

//分享时可能会需要,动态URL。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
{
    self.shareUrl = [request.URL description];
    return YES;
}
1.5 清除页面缓存

NSHTTPCookie *cookie;

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

for (cookie in [storage cookies])
{
    [storage deleteCookie:cookie];
}
1.6 停止加载

[self.mainWebView stopLoading];
1.7 获取Scheme

需求:登录页面,自定义SSO协议,当各app端拿到自己规定的scheme,停止页面加载,拿到对应数据。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"%@",request.URL.scheme);
    return YES;
}
1.8 返回添加关闭按钮

需求:当点击进入两次以上网页,想直接返回app,那么就需要一个关闭按钮
- (void)leftBarButtonClick:(id)sender
{

    if (self.webView.canGoBack)

    {

        [self.webView goBack];

        [self showWebCloseButton];

    }
    else
    {

        [self popViewController];

    }

}
1.9 检测页面上的电话

1.检测网页上的电话号码,点击可拨打

webView.detectsPhoneNumbers = YES;


2.自动识别 网址,电话等

webView.dataDetectorTypes = UIDataDetectorTypeAll;
1.10 webView 禁止滚动

当把webView放在tableView上,手势会冲突,这时需要禁止webView滚动

webView.scrollView.scrollEnabled=NO;
1.11 获取HTML高度

获取HTML高度后,可以设置webView高度,然后拼接在tableView上。

- (void)webViewDidFinishLoad:(UIWebView *)webView {

    CGRect frame = webView.frame;

    frame.size.height = webView.scrollView.contentSize.height;

    webView.frame = frame;

    self.tableView reloadData];

}
1.12  JS 调用 OC 方法

  需求:一个H5抽奖运营活动,促进老用户升级到App最新版本。

  最新版本:1.4.0~

  解决方案:oc 获取到当前App版本号,H5调用判断是否为1.4.0版本。
  如果是,用户抽奖,否则提示升级。

  实战:规定
  规定名称:JSInterFace
  规定方法:- (nonnull NSString *)getVersionName;

  第一步:导入 JavaScriptCore.framework ,如图1。

  第二步:导入头文件 #import <JavaScriptCore/JavaScriptCore.h>

  第三步:创建webView,并加载到视图。

  第四步:建立 JSContext 桥梁。

  @property (nonatomic, strong) JSContext *jsContext;

  - (void)webViewDidFinishLoad:(UIWebView *)webView{
    //建立连接
    self.jsContext = (JSContext *)[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    self.jsContext.exceptionHandler = ^(JSContext *con, JSValue *exception) {
        NSLog(@"%@", exception);
        con.exception = exception;
    };
    //创建对象,处理来自JS调用的类
    JSInterFace *interFace = [[JSInterFace alloc] init];
    self.jsContext[@"JSInterFace"]= interFace;

}
  第五步:写 JSInterFace类
  JSInterFace.h

  #import <Foundation/Foundation.h>

  @class JSInterFace;

  @import JavaScriptCore;

  @protocol EPJSExport <JSExport>

  - (nonnull NSString *)getVersionName;

  @end


  @interface JSInterFace : NSObject <EPJSExport>


  @end


  JSInterFace.m

  #import "JSInterFace.h"

  @implementation JSInterFace

  - (nonnull NSString *)getVersionName
  {

    //这里打断点就可以查看是否被调用了,
    //如需回调到控制器实现功能,可选用block或者代理。
      return (NSString *)[[NSBundle mainBundle]   
    objectForInfoDictionaryKey:@"CFBundleVersion"];
  }

@end

如需Demo,请关注后联系作者~

图1


屏幕快照 2016-08-23 上午10.54.13.png
1.13 oc调用js方法

这个场景非常少见,作者询问了几个H5开发,基本都没有用到这个场景。我能想到的就是App外壳包装的H5,遇到异常的时候,做出相应的提示而已。

第一步:导入 JavaScriptCore.framework ,如图1。

第二步:导入头文件 #import <JavaScriptCore/JavaScriptCore.h>

第三步:创建webView,并加载到视图。

第四步:建立 JSContext 桥梁。

#import "ViewController.h"

#import <JavaScriptCore/JavaScriptCore.h>

#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width //屏幕宽度

#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height //屏幕高度

@interface ViewController ()<UIWebViewDelegate>

@property (nonatomic , strong)UIWebView *mainWebView;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.mainWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
    self.mainWebView.delegate = self;
    NSURL *url = [NSURL URLWithString:@"http://www.jianshu.com/users/d10b02ea2d91/latest_articles"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    self.mainWebView.scalesPageToFit = YES;

    [self.mainWebView loadRequest:request];
    [self.view addSubview:self.mainWebView];

}
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    //网页加载完成调用此方法
    //首先创建JSContext 对象
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    OC 调用 JS alert 弹框
    NSString *alertJS=@"alert('这个博客非常好')";
    [context evaluateScript:alertJS];//通过oc方法调用js的alert

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多