您现在的位置:主页 > 技术中心 > 编程开发 > 移动开发 > Iphone

自己动手写iPhone wap浏览器之预备篇(手把手教你iphone开发 – 进阶篇)

来源:网络 责任编辑:admin 发表时间:2013-07-01 16:48 点击:

作者:孙东风 2009-12-01(转载请注明出处)

 

在笔者的上一篇文章《玩转iPhone网络通讯之BSD Socket篇》中,笔者试图在iPhone平台上利用BSD Socket搭建了一个同时兼容TCP/IP和HTTP协议进行通讯的框架,而在接下来的几篇文章里,笔者将进一步完善这个网络通讯的引擎并利用这个引擎写一个简易的wap浏览器。

 

在iPhone的safari浏览器上并不支持WML的解析,尽管笔者也认为WML这种抱残守旧的技术被淘汰是迟早的事,但WML作为XML结构的一个“变种”进行学习还是不错的。

 

最近浏览器技术很热,热得笔者都摸不着头脑,前段时间金山的雷军同志也投资UCWeb,尽管笔者并不觉得浏览器技术有什么高深的技术含量抑或可进行投资的价值,其实浏览器充其量是个客户端,但是既然人家大牛看好,那笔者研究研究也不无益处,或许看完本文读者也可以拿着自己的产品去找雷军同志投资一把了:)

 

闲话少话,言归正传。

 

上面说了,WML是XML结构的一个“变种”或者说特例,既然是特例那么就可以把它当成XML来进行解析。那么做一个浏览器的任务流程就清晰了,如下:

 

²        封装BSD Socket进行HTTP请求。

²        将请求到的WML页面解析成XML数据结构。

²        渲染需要在界面上显示的WML标签(英文名tag)。

²        将渲染后的WML标签显示在界面上(UIView)。

 

其中第一条在笔者的前一篇文中《玩转iPhone网络通讯之BSD Socket篇》已经进行了初步的编写,当然笔者还会在下面的文章中进一步完善。

 

这篇文章中着重讲解WML的解析,因为WML是XML数据的特例,解析WML也就意味这解析XML。

 

说到解析XML,iPhone为程序员提供了很多工具比如NSXMLParser,这个类的接口定义如下:

 

@interface NSXMLParser : NSObject {

@private

    void * _parser;

    id _delegate;

    id _reserved1;

    id _reserved2;

    id _reserved3;

}

- (id)initWithContentsOfURL:(NSURL *)url;  // initializes the parser with the specified URL.

- (id)initWithData:(NSData *)data; // create the parser from data

 

// delegate management. The delegate is not retained.

- (id)delegate;

- (void)setDelegate:(id)delegate;

 

- (void)setShouldProcessNamespaces:(BOOL)shouldProcessNamespaces;

- (void)setShouldReportNamespacePrefixes:(BOOL)shouldReportNamespacePrefixes;

- (void)setShouldResolveExternalEntities:(BOOL)shouldResolveExternalEntities;

 

- (BOOL)shouldProcessNamespaces;

- (BOOL)shouldReportNamespacePrefixes;

- (BOOL)shouldResolveExternalEntities;

 

- (BOOL)parse;  // called to start the event-driven parse. Returns YES in the event of a successful parse, and NO in case of error.

- (void)abortParsing;    // called by the delegate to stop the parse. The delegate will get an error message sent to it.

 

- (NSError *)parserError;      // can be called after a parse is over to determine parser state.

@end

 

从接口的定义中大致可以知道,这个类解析XML是采用SAX模式(Simple API for XML),而SAX是基于事件驱动的,其基本工作流程是分析XML文件流数据,每当发现一个新的元素时,就会产生一个对应的事件,并调用相应的用户处理函数。在iPhone上苹果公司采用了delegate模式,每发现一个新的元素时,就会调用相应的委托接口进行XML标签的处理。

 

利用SAX模式解析XML占用内存少、速度快,但用户需要把解析到的XML标签自己组合成一个树状结构,从而使程序处理比较复杂。

 

而对WML浏览器来说,尽管其tag并不是特别多,但是如果想完整的支持WML的tag也是一件比较枯燥的事情。所以,笔者这里采用DOM(Document Object Model)模式来解析XML文件。DOM模式在分析XML文件时,一次性的将整个XML文件流进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,速度往往慢于SAX模式,但可以给程序员提供一个面向对象的访问接口,较为方便。

 

XML语言的全称是可扩

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      评价:
      表情:
      用户名: 验证码:点击我更换图片

      推荐热点

      • Lexical or Preprocessor Issue 'xxx.h
      • ios学习笔记(二)xcode 4.3.2下实现基本交互
      • ios版本的helloworld
      • iphone(object-c) 内存管理(3) 有效的内存管理
      • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
      • UITableView一些方法
      • IOS类似iphone通讯录TableView的完整demo【附源码】
      • [iPhone中级]iPhone团购信息客户端的开发 (二)
      • iphone(object-c)内存管理(1)
      ?? - ?? - ÝřŝžľŘÝź - TAGąęÇŠ - RSSśŠÔÄ - ??
      Copyright © 2004-2024 上海卓卓网络科技有限公司