iOS,html使用交互相关
UIWebView加载Html文件
//uiwebview加载网络页面(使用UIWebView可以加载pdf文件)
UIWebView *webView=[[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//自动对页面进行缩放
webView.scalesPageToFit=YES;
//加载页面内容,也可以加载本地文件loginAlipay.html
NSURL *url=[NSURL URLWithString:@"http://baidu.com"];
NSURLRequest *request=[NSURLRequest requestWithURL:url];
[webView loadRequest:request];
[self.view addSubview:webView];
//uiwebview加载本地html
UIWebView *webView=[[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//自动对页面进行缩放
webView.scalesPageToFit=YES;
//加载页面内容,也可以加载本地文件loginAlipay.html
NSString *path=[[NSBundle mainBundle] pathForResource:@"loginAlipay"ofType:@"html"];
NSURL *url=[NSURL fileURLWithPath:path];
NSURLRequest *request=[NSURLRequest requestWithURL:url];
[webView loadRequest:request];
[self.view addSubview:webView];
UIWebView的委托方法
//1.web视图指示加载内容时通知。应该返回YES开始加载。导航提供的类型参数,是指请求的来源,可以是下列任何一个:
//UIWebViewNavigationTypeLinkClicked 用户触击了一个链接
//UIWebViewNavigationTypeFormSubmitted 用户提交了一个表单
//UIWebViewNavigationTypeBackForward 用户触击前进或返回按钮
//UIWebViewNavigationTypeReload 用户触击重新加载的按钮
//UIWebViewNavigationTypeFormResubmitted 用户重复提交表单
//UIWebViewNavigationTypeOther 发生其它行为
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; //2.开始加载的时候执行该方法。
- (void)webViewDidStartLoad:(UIWebView *)webView; //3.加载完成的时候执行该方法。
- (void)webViewDidFinishLoad:(UIWebView *)webView; //4.加载出错的时候执行该方法。
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
UIWebView和JS交互
//html文件
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>IOS调用JS测试</title>
<script language="javascript">
//提供给iOS调用的JS方法
function check(str){
return str+",经过JS返回值";
}
//JS调用iOS方法
function CallIos(){
//JS调用oc,UIWebView
//location.href = "/CallIos/test";
window.location = "/CallIos/test";
}
</script>
</head>
<input style="width:30%;height:20%;margin-left:35%;margin-top:30%" type="button" value="进行IOS调用JS测试" onclick="CallIos()"/>
</html>
//CallJSViewController.m文件
#import "CallJSViewController.h"
@interface CallJSViewController ()
@property (strong,nonatomic) UIWebView *webView;
@end @implementation CallJSViewController - (void)viewDidLoad {
[super viewDidLoad];
_webView=[[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_webView.scalesPageToFit=YES;
NSString *path=[[NSBundle mainBundle] pathForResource:@"JSTest"ofType:@"html"];
NSURL *url=[NSURL fileURLWithPath:path];
NSURLRequest *request=[NSURLRequest requestWithURL:url];
[_webView loadRequest:request];
_webView.delegate=self;
[self.view addSubview:_webView];
} //网页中得每一个请求都会触发
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{
//获取js请求。字符串为/CallIos/test
NSString *obj=request.mainDocumentURL.relativePath;
if([request.mainDocumentURL.relativePath isEqualToString:@"/CallIos/test"])
{
NSLog(@"why");
return NO;
}
return YES;
} //页面加载完毕委托
-(void)webViewDidFinishLoad:(UIWebView *)webView{
//调用js方法,并接收返回值
NSString *jsStr=[self.webView stringByEvaluatingJavaScriptFromString:@"check('页面加载完毕')"];
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"提示" message:jsStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
@end
使用Safari,WebView调试html
打开模拟器(真机)的开发者模式
【设置】->【Safari】->【高级】->【Web检查器】打开
打开iphone设备中的web检查器
2. 打开Mac上Safari的开发者模式
【Safari】->【偏好设置】->【高级】->【在菜单栏中显示“开发”菜单】勾选
打开Safari中的开发者模式
3. 写一个webview并加载一个网页
#import "ViewController.h"
@interfaceViewController ()
@property (strong, nonatomic) UIWebView *webView;
@end @implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_webView = [[UIWebViewalloc] initWithFrame:self.view.bounds];
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:_webView];
}
@end
4. 在模拟器(真机)中打开webview应用,并打开Safari查看网络信息
【开发】->【iOS Simulator】->【正在调试的网站】
注意:必须要webview在加载网页时,打开Safari才可以看到调试模式。
打开Safari中的调试
在弹出的调试窗口中,可以看到当前正在加载网页的各种信息,包括源码、请求头、图片、加载的资源与脚本、控制台输出等。并且它和web前端的调试方式相同,你可以直接修改网页的CSS样式,对网页布局等进行修改,而不用重新运行整个App。
5. 修改web样式
将光标选中到要修改的样式,进行修改后,可以直接在模拟器中看到修改后的效果。
直接修改webview中的样式,当然,webview的调试技巧还有很多,比如Charles工具等。
使用WKWebView加载Html,和JS交互
//JSTest.html文件
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>IOS调用JS测试</title>
<script language="javascript">
//提供给iOS调用的JS方法
function check(str){
return str+",经过JS返回值";
}
//JS调用iOS方法
function CallIos(){
//JS调用oc
window.webkit.messageHandlers.myScript.postMessage("JS调用WKWebView");
}
</script>
</head>
<input style="width:30%;height:20%;margin-left:35%;margin-top:30%" type="button" value="进行IOS调用JS测试" onclick="CallIos()"/>
</html>
使用WKWebView
头文件:
#import <WebKit/WebKit.h>
协议:
WKNavigationDelegate,WKScriptMessageHandler
//WKWebView是苹果在 iOS 8 中引入的新组件,目的是给出一个新的高性能的 Web View 解决方案,摆脱过去 UIWebView 的老旧笨重特别是内存占用量巨大的问题。WKWebView使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safari一样快。
@property(nonatomic,strong) WKWebView *webView; //WKUserContentController对象提供了一个JavaScript来发布信息和用户脚本注入web视图
@property(nonatomic,strong) WKUserContentController *userContentController;
//js调用app的方法在WKWebView分为三步(具体分为app注册handler,app处理handler,js调用)
//app注册handler
WKWebViewConfiguration * Configuration = [[WKWebViewConfiguration alloc]init];
//添加js和wkwebview的调用
_userContentController =[[WKUserContentController alloc]init];
[_userContentController addScriptMessageHandler:self name:@"myScript"];//注册一个name为myScript的js方法
Configuration.userContentController = _userContentController;
_webView=[[WKWebView alloc] initWithFrame:[[UIScreen mainScreen] bounds] configuration:Configuration]; NSString *path=[[NSBundle mainBundle] pathForResource:@"JSTest" ofType:@"html"];
NSURL *url=[NSURL fileURLWithPath:path];
NSURLRequest *request=[NSURLRequest requestWithURL:url];
_webView.navigationDelegate=self;
//加载html页面
[_webView loadRequest:request];
[self.view addSubview:_webView];
#pragma mark -加载的状态回调
// 页面开始加载时调用
-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
NSLog(@"页面开始加载");
} // 当内容开始返回时调用
-(void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
NSLog(@"页面内容开始返回");
} // 页面加载完成之后调用
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
NSLog(@"页面加载完成"); //调用js方法接收返回值
[_webView evaluateJavaScript:@"check('页面加载完毕')" completionHandler:^(id _Nullable script, NSError * _Nullable error) {
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"提示" message:script delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}];
} // 页面加载失败时调用
-(void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error{
NSLog(@"页面加载失败");
} #pragma mark -页面跳转的代理方法
// 接收到服务器跳转请求之后调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation{
NSLog(@"接收到服务器跳转请求");
} // 在收到响应后,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
NSLog(@"收到响应决定是否跳转");
WKNavigationResponsePolicy actionPolicy = WKNavigationResponsePolicyAllow;
//这句是必须加上的,不然会异常
decisionHandler(actionPolicy);
} // 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
NSLog(@"发送请求之前,决定是否跳转");
//这句是必须加上的,不然会异常
WKNavigationActionPolicy actionPolicy = WKNavigationActionPolicyAllow;
decisionHandler(actionPolicy);
} #pragma mark 设置wkwebview的WKScriptMessageHandler代理方法处理handler委托,js请求 -(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
if ([message.name isEqualToString:@"myScript"]) {
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"提示" message:message.body delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
} -(void)dealloc{
//关闭web页面时会释放内存
[_userContentController removeScriptMessageHandlerForName:@"myScript"];
}
@end
iOS,html使用交互相关的更多相关文章
- iOS UIWebView与JavaScript的交互 相关资料
UIWebView自适应宽度 iOS UIWebView中javascript与Objective-C交互.获取摄像头 iOS中JavaScript和OC交互 iOS与js交互,获取webview完整 ...
- Cordova - 与iOS原生代码交互2(使用Swift开发Cordova的自定义插件)
在前一篇文章中我介绍了如何通过 js 与原生代码进行交互(Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)),当时是直接对Cordova生成的iOS工程项目进行编辑操作的(添加 ...
- iOS与HTML5交互方法总结(转)
今天小编在找技术文章的时候,发现这样一个标题:iOS与HTML5交互方法总结,怎么看着这么熟悉呢? 还以为是刚哥用了别的文章,点进去一看,原来是刚哥自己写的文章,他们转载的,而且还上了Dev St ...
- 关于UIView用户交互相关的属性和方法
UIView除了负责展示内容给用户外还负责响应用户事件 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除 ...
- iOS与H5交互
H5与App原生交互,一般会是前端页面中的JavaScript与App使用的原生开发语言的交互.技术方案应能达到以下要求: 在js与原生进行交互的时候能保证正常的正向调用逻辑返回,反向可以处理异步回调 ...
- iOS应用程序状态切换相关
一.iOS应用程序状态机一共有五种状态: 1. Not running:应用还没有启动,或者应用正在运行但是途中被系统停止. 2. Inactive:当前应用正在前台运行,但是并不接收事件(当前或许正 ...
- WebViewJavascriptBridge详细使用 iOS与H5交互的方案
WebViewJavascriptBridge详细使用 源网址: https://www.cnblogs.com/jiang-xiao-yan/p/5345755.html 前言 WebView ...
- iOS与HTML5交互方法总结(修正)
摘要 看了不少别人写的博客或者论坛,关于iOS与HTML5交互方法大概主要有5种方式: 1. 利用WKWebView进行交互(系统API) 2. 利用UIWebView进行交互(系统API) 3. 苹 ...
- 转:基于IOS上MDM技术相关资料整理及汇总
一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...
随机推荐
- 洛谷 P1014 Cantor表 Label:续命模拟QAQ
题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...
- 求1+2+……+n(位运算)
求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 我发现网上的做法都很神,各种理由编译的巧妙办法,就能间接 ...
- BZOJ4491: 我也不知道题目名字是什么
Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一 ...
- IE6、7绝对定位层被遮挡的原因(主要是父层决定的)
最近做项目,经常遇到IE7以下浏览器中.一些悬浮框被一些元素遮挡的问题,这些元素一般都是设置了position的.问题的根本在不是被设置绝对定位的元素上,而是在设置了相对定位的父元素上. 我查阅了 ...
- 向linux内核中添加外部中断驱动模块
本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...
- C语言-结构体
#include<stdio.h> struct stu //定义结构体类型 { int num; char *name; char *sex; float score; } boy[]= ...
- 用js读写cookie的简单办法
/* 功能:保存cookies函数 参数:name,cookie名字:value,值 */ function SetCookie(name,value){ var Days = 30*12; //co ...
- 【hihoCoder】1049.后序遍历
问题:http://hihocoder.com/problemset/problem/1049?sid=767510 已知一棵二叉树的前序遍历及中序遍历结果,求后序遍历结果 思路: 前序:根-左子树- ...
- mysql远程连接提示无法连接,报1130错误
可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”l ...
- tomcat域名问题
首先可以确认,tomcat支持以下的配置: 1.同一个tomcat配置多个端口来发布不同的应用,配置多个<Service>即可; 2.同一个tomcat可以配置多个虚拟主机,以指定不同的域 ...