IOS UIWebView与JavaScript交互实现Web App

上一篇文章讲到了Android WebView与JavaScript的交互问题,现在来讲一下IOS的UIWebView与JavaScript的交互问题。和Android的相比,IOS的会略显笨拙一些不大友好,然而也算是在未引用第三方框架的基础上完成了交互的问题。OK,现在开始吧。

1.首先在IOSA->Application下选择Single View Application创建一个IOS应用,命名为JSInteraction,然后我删去了Info.plist文件里Main storyboard file base name字段,选择加载ViewController的View。

 

1.修改AppDelegate.m的didFinishLaunchingWithOptions并添加如下代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window makeKeyAndVisible];

    ViewController * viewController = [[ViewController alloc] init];
    [self.window setRootViewController:viewController];

    return YES;
}

2.修改类ViewController,添加一个WebView并添加与JavaScript交互的功能。

//
//  ViewController.h
//  JSInteraction
//
//  Created by Winter on 15/8/12.
//  Copyright (c) 2015年 YLD. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIWebViewDelegate> {
    UINavigationItem *item_;
}

@property (nonatomic, strong) UIWebView *webView;

@end

在WebView的shouldStartLoadWithRequest处理JS的请求根据JS的传入的Url来判断JS所需的操作。在这里面我主要提供了一个弹出对话框的接口,当JS传入的URL是以jsinteraction:showAleart开头时则调用ViewController里的showAlert方法,而JS需要从App获取数据时,则需要WebView调用stringByEvaluatingJavaScriptFromString方法并传入后台JS提供的方法并传入参数来实现传递数据给后台的JS。有点绕,且看看实现方式。

//
//  ViewController.m
//  JSInteraction
//
//  Created by Winter on 15/8/12.
//  Copyright (c) 2015年 YLD. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 20, self.view.bounds.size.width, 30.0f)];
    bar.backgroundColor = [UIColor clearColor];
    item_ = [[UINavigationItem alloc] initWithTitle:@""];
    [bar pushNavigationItem:item_ animated:YES];
    [self.view addSubview:bar];

    self.view.backgroundColor = [UIColor colorWithRed:0.0f green:20.0f blue:255.0f alpha:1.0f];
    self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(10.0f, 60.0f, self.view.bounds.size.width-20, self.view.bounds.size.height - 80.0f)];
    self.webView.delegate = self;
    [self.view addSubview:self.webView];

    [self initializeWebView];

    // Do any additional setup after loading the view, typically from a nib.
}

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

/*
 * Load local html file
 */
- (void)initializeWebView {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"LoginJs/login" ofType:@"html"];

    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *requestString = [[request URL] absoluteString];
    NSArray *headers = [requestString componentsSeparatedByString:@":"];

    if([headers count]>1) {
        NSString *appAction = [(NSString *)[headers objectAtIndex:0] lowercaseString];
        NSString *funtionName =(NSString*)[headers objectAtIndex:1];

        if([appAction isEqualToString:@"jsinteraction"]) {
            if([funtionName isEqualToString:@"showAleart"] && [headers count] > 2){
                NSString* message = (NSString*)[headers objectAtIndex:2];

                [self showAleart:message];
            }

            return NO;
        } else if([appAction isEqualToString:@"executescript"]){
            if([funtionName isEqualToString:@"loginObj.setLoginInfo"]){
                NSString *loginInfo = @"'{\"Username\":\"YLD\",\"Password\":\"111\"}'";
                NSString *execute = [NSString stringWithFormat:@"loginObj.setLoginInfo(%@)", loginInfo];

                [webView stringByEvaluatingJavaScriptFromString:execute];
            }
            return NO;
        }
    }

    return YES;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    item_.title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}

/**
 * 弹出消息对话框
 */
- (void)showAleart: (NSString *) message {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Warning"
                                                        message:message
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil , nil];

    [alertView show];
}

@end

3.IOS端已经完成,根据目前的实现,JS端需要请求的URL须是以下两种格式才能实现与IOS的交互。

1)jsinteraction:showAleart:xxxx

2)  executescript:loginObj.setLoginInfo:xxxx

4.下面实现web端的功能,新建一个文件夹命名为LoginJs,在改文件夹下添加两个文件,login.html和login.js。login.html有两个文本输入框我们会在程序启动时让IOS端为其注入相应的数据,再有一个登录按钮,点击按钮则会调用IOS端ViewController的showAlert方法,弹出对话框。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title id="title">Login</title>
	<script type="text/javascript" src="login.js"></script>
</head>

<body style="background:lightblue">
	<div style="margin-top: 20px;margin-left: 20px">
		<div>
			<label>Username:</label>
			<input id="txtUsername" type="text" style="margin-left: 20px"/>
		</div>
		<div style="margin-top: 20px">
			<label>Password:</label>
			<input id="txtPassword" type="text" style="margin-left: 20px"/>
		</div>
		<div style="margin-top: 20px;margin-left: 160px">
			<button onclick="loginObj.login()" style="width:100px">Login</button>
		</div>
	</div>
</body>
</html>

在login.js中实现相应的方法,在页面加载完成时会调用请求,请求IOS端的数据。实现与IOS端的交互主要是依靠更改window的location。

"user strict"

var Login = (function(){
	function Login(){

	}

	Login.prototype.login = function(){
		this.appRequest("JSInteraction", "showAleart", "Start...");
	}

    /**
     * 设置登录信息
     * @logininfoJson json参数字符串
     */
	Login.prototype.setLoginInfo = function(logininfoJson){
		//解析json字符串
        var logininfo = eval("("+logininfoJson+")");

		document.getElementById("txtUsername").value = logininfo.Username;
		document.getElementById("txtPassword").value = logininfo.Password;
	}

    Login.prototype.appRequest = function(appAction, functionName, parameters){
        var requestCommand = appAction + ":" + functionName + ":" + parameters;

        window.location = requestCommand;
    }

	return Login;
})();

var loginObj = new Login();

window.onload=function(){
    loginObj.appRequest("executeScript", "loginObj.setLoginInfo", "");
}

5.接下来我们将web的LoginJs添加至IOS的JSInteraction工程中

添加完成后,工程结构如下图

6.运行App,效果如下所示。

点击Login按钮

源代码下载页:http://download.csdn.net/detail/leyyang/9000543

版权声明:本文为博主原创文章,转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

时间: 2024-10-24 13:11:49

IOS UIWebView与JavaScript交互实现Web App的相关文章

Android WebView与JavaScript交互实现Web App

当我们去开发一个基于web的android app时,我们第一须要处理的就是与JavaScript的交互问题.Android须要做的事情就是开放某些特定的接口供web里的JavaScript调用,能够开放弹出框功能,Toast,界面跳转等等.这样我们的web视图以假乱真的当成Android的原生界面.而这套web代码又能够嵌入iPhone的client中.也就是说Android和IOSclient不过提供一个共web使用的框架,业务都由web端处理.这岂不是开发一次.可处处执行.然而这一切都是后

IOS中UIWebView和JavaScript交互(转自http://blog.2jun.net/2012/11/02/webviewandjs/)

IOS中UIWebView和JavaScript交互 当程序中使用到UIWebView控件的时候,难免会遇到需要与页面进行交互的情况.这种情况在android平台下比较容易处理,android平台下WebView控件的addJavascriptInterface()方法可以很轻松的完成交互,而IOS上就稍复杂一些. 页面与客户端的交互是通过JS来完成的,通常情况下与JS的交互可以分为两种:客户端传递给JS一些数据和JS向客户端请求一些本地操作.下面分别对这两种情况进行处理. JS向客户端请求本地

iOS UIWebView与JavaScript的交互 相关资料

UIWebView自适应宽度 iOS UIWebView中javascript与Objective-C交互.获取摄像头 iOS中JavaScript和OC交互 iOS与js交互,获取webview完整url,title,获取元素并赋值跳转 示例 https://github.com/shaojiankui/WebViewJS wanggang316/ClickWebViewImage 点击webview上的图片,调用js获取,展示,保存

Xcode6 UIWebView与JavaScript交互(issue fix)

这篇文章中,有介绍UIWebView与JavaScript交互,在UIWebView截获JavaScript请求处理,从app的角度,这是JavaScript的Hook请求. 在Xcode6之前的App版本,JavaScript可以这样将Hook请求发送出来: HTML: <li><a href="testapp://function=test&callbackJS=testCallback">test link</a></li>

UIWebView与javascript交互三通过OC页面来改变html页面上的值

有一件事要说一下哦, <UIWebView与javascript交互一>这篇博客被几个网站给转载了,很开心,但是开心之余有一点觉得要说一下,大家转载别人的文章的时候记得说明一下转载的出处,有两方面的原因,第一就是尊重作者的劳动成果,另一方面,由于博客里有的时候有一些demo,但是转载的人并没有把demo的下载地址给贴出来,给看到博客的同学带来了很大的不便. 接上篇,我们已经实现了通过html按钮来传数据到oc页面,但是没有实现通过oc页面传数据到js页面,并修改html的页面,谈不上真正完全的

iOS 利用UIWebView与JavaScript交互的最简单办法

这里说的是针对iOS的!并且方法很简单!!并且验证可行的!!! 1, UIWebView调用 JavaScript 的函数: NSString* strValue = [webView stringByEvaluatingJavaScriptFromString:@"YourFunctionName('YourParameter')"]; 上面这句就是调用 JavaScript里面自定义的函数 YourFunctionName(传入参数'YourParameter',取得返回值赋给st

iOS 利用UIWebView与JavaScript交互的最简单办法(本人已验证可行)

本贴转自:http://blog.csdn.net/h_o_w_e/article/details/28887005 1, UIWebView调用 JavaScript 的函数: NSString* strValue = [webView stringByEvaluatingJavaScriptFromString:@"YourFunctionName('YourParameter')"]; 上面这句就是调用 JavaScript里面自定义的函数 YourFunctionName(传入

UIWebView与javascript交互一

去年看了两本书上面都有提到UIWebView与javascript的交互,但是很少提交具体的操作.今年时间稍微闲下来,我觉得很有必要把这个知识点整理一下. 首先一定要储备一些简单的javascript知识,我看的是这本电子书<javascript从入门到精通>另外还要有一些简单的html知识的基础. 我主要实现的功能就是加载html文件,并操作html上的输入框,按钮进行操作. test.html的代码如下: <html> <head> <title>tes

UIWebView与javascript交互二通过页面的响应事件获取页面输入框内的值

接上篇文章,上篇文章实现了UIwebview对html文件的加载和对js事件的响应,但是对html页面上输入的值没有获取. 今天就来说说这个首先要用到工具类WebViewJavascriptBridge 下载地址 然后将工具类导入到项目中. 其中test.js我做了如下的调整: window.onerror = function(err) { log('window.onerror: ' + err) } function connectWebViewJavascriptBridge(callb