使用WebView构建HyBird应用

HyBird是一种本地技术与Web相结合,能过实现跨平台的移动应用开发,最常用的一个框架:PhoneGap

一:首先,写好html代码

 <!DOCTYPE html>
 <html>
     <head>
         <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
         <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
         <script>
             //从iOS对象中调用
             function  helloWorld(msg) {
                 document.getElementById('message').innerHTML = msg;
             }
             //调用iOS对象
             function showAndroidDialog(msg) {
                 var myJSONObject = new Object();
                 myJSONObject.title = 'HelloWorld';
                 myJSONObject.message = msg;
                 var JSONString = JSON.stringify(myJSONObject);
                 var uri = 'gap://XXXClass.XXXmethod#' + JSONString;
                 window.location = uri;
             }
          </script>

     </head>
     <body>
         <h2>iOS本地与Web互相调用</h2>
         <button onclick='showAndroidDialog("JS to iOS 对象")'>调用iOS对象</button>
         <br><br>
         <div  id='message'></div>
     </body>
 </html>

二:在iOS中调用javaScript代码:

 - (void)viewDidLoad
 {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.

     self.webView.delegate = self;
     NSString *path = [[NSBundle mainBundle] pathForResource:@"www/index" ofType:@"html"];
     [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath: path]]];
 }

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

 #pragma mark UIWebViewDelegate

 - (void)webViewDidFinishLoad:(UIWebView *)webView
 {
     [self.webView stringByEvaluatingJavaScriptFromString:@"helloWorld('从iOS对象中调用JS Ok.')"];
 }

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
 {
     NSString *actionType = request.URL.host;
     NSString *scheme = request.URL.scheme;
     NSString *fragment = [request.URL.fragment URLDecodedString];
     NSData *responseData = [fragment dataUsingEncoding:NSUTF8StringEncoding];

     if ( [scheme isEqualToString:@"gap"] ) {
         if ([actionType isEqualToString:@"XXXClass.XXXmethod"]) {

             NSError* error;
             NSDictionary* json = [NSJSONSerialization
                                   JSONObjectWithData:responseData
                                   options:NSJSONReadingAllowFragments
                                   error:&error];

             NSLog(@"title: %@ , message: %@",[json objectForKey:@"title"], [json objectForKey:@"message"] );

         }
     }
     return true;
 }

注:这里用到了一个NSString的分类用于字符串雨URL的编码与解码

 - (NSString *)URLEncodedString
 {
     NSString *result = (NSString *)
     CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                             (CFStringRef)self,
                                             NULL,
                                             CFSTR("!*'();:@&amp;=+$,/?%#[] "),
                                             kCFStringEncodingUTF8));
     return result;
 }

 - (NSString*)URLDecodedString
 {
     NSString *result = (NSString *)
     CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault,
                                                             (CFStringRef)self,
                                                             CFSTR(""),
                                                             kCFStringEncodingUTF8));
     return result;
 }

WebView 总结:

一:网页加载
1:回退和前进

//    if ([webView canGoBack]) {
//        self.backItem.enabled = YES;
//    } else {
//        self.backItem.enabled = NO;
//    }
self.backItem.enabled = [webView canGoBack];
self.forwardItem.enabled = [webView canGoForward];

self.backItem.enabled = [webView canGoBack];
self.forwardItem.enabled = [webView canGoForward];

2:字符串查找
// 如果在path中找不到@“baidu”这个字符串
//    [path rangeOfString:@"baidu"].length == 0;
//    [path rangeOfString:@"baidu"].location == NSNotFound

// URL格式:协议头://主机名/路径
// request.URL.path : 获得的仅仅是主机名(域名)后面的路径
// request.URL.absoluteString : 获得的是一个完整的URL字符串

// 1.获得完整的url字符串
NSString *url = request.URL.absoluteString;
NSUInteger loc = [url rangeOfString:@"baidu"].location;

// 2.找到baidu字符串,返回NO
if (loc != NSNotFound) { // 能找到
    return NO; // 禁止加载
}

// 3.如果没有找到,返回YES
return YES;

//    return loc == NSNotFound ? YES : NO;
//    return loc == NSNotFound;

 
 

iOS开发——网络编程OC篇&使用WebView构建HyBird应用的更多相关文章

  1. iOS开发——网络编程OC篇&Socket编程

    Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作 ...

  2. iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备

    XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈 ...

  3. iOS开发——网络编程OC篇&GCDAsyncSocket编程

    GCDAsyncSocket编程 同上一篇文章一样,这里也是使用Socket实现一个聊天室,但是这里使用的是一个常用的框架实现的:GCDAsyncSocket 一:导入这个框架 二:声明这个Socke ...

  4. iOS开发——网络编程OC篇&(二)XMPP实现用户登录与注销

    XMPP实现用户登录与注销 登录: 步骤: * 在AppDelegate实现登录 1. 初始化XMPPStream 2. 连接到服务器[传一个JID] 3. 连接到服务成功后,再发送密码授权 4. 授 ...

  5. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  6. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  7. iOS开发——网络编程Swift篇&Alamofire详解

    Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...

  8. iOS开发——网络编程Swift篇&(八)SwiftyJSON详解

    SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...

  9. iOS开发——网络编程Swift篇&(七)NSURLSession详解

    NSURLSession详解 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ func sessionLoadData() { //创建NSURL对象 var ...

随机推荐

  1. Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录

    <set name ='students' table="students_table" inverse='false'(默认不用写) > <key column ...

  2. sendip简单使用

    sendip是linux下一个比较好用的发包软件,简单记录一下它的用法 下载源码,编译安装后,可通过  man sendip,查看具体选项介绍,其中说明sendip支持的协议包括:ipv4 ipv6 ...

  3. 装饰模式decorator

    C++设计模式——装饰模式 前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会 ...

  4. 初识MFC,WinForm,WPF,Q't

    MFC和QT是C++中常见的GUI框架,而WinForm和WPF是C#中常用的框架,不过我们一般很少叫WinForm框架,可能直接叫图形控件类库更多点.反正只是个称呼罢了,爱咋叫就咋叫.另外WinFo ...

  5. Firefox 对条件判断语句块内的函数声明的处理与其他浏览器有差异

    标准参考 函数声明和函数表达式 定义一个函数有两种途径:函数声明和函数表达式. 函数声明: function Identifier ( FormalParameterList opt ) { Func ...

  6. <转>Linux环境进程间通信(二): 信号(上)

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html 原文如下: 一.信号及信号来源 信号本质 信号是在软件层 ...

  7. linux 下查找大于100M的文件

    命令行如下 find . -type f -size +100M Linux系统下查找大文件或目录的技巧 当硬盘空间不够时,我们就很关心哪些目录或文件比较大,看看能否干掉一些了,怎么才能知道呢?以易读 ...

  8. mongodb高级操作及在Java企业级开发中的应用

    Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...

  9. Animation Spinner【项目】

    https://github.com/vjpr/healthkick/blob/master/src/win/healthkick/ucSpinnerCogs.xaml 网上的例子,放在UserCon ...

  10. ?this&函数自身的引用

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...