基于iOS 平台Safari 浏览器的设计与实现
2013-12-29张磊
摘要:随着移动互联网发展越来越快,iOS成为发展最为迅速的手机操作系统之一。基于IOS平台的safari浏览器的开发由此产生,该文使用Objective-C语言和Sqlite数据库技术,在Xcode环境下,实现基于iOS平台的Safari浏览器系统,为用户提供了一个快速上网浏览的入口,不仅满足了用户的需求,而且使用户的体验更加良好。
关键词:iOS;Safari;Sqlite;Xcode
中图分类号:TN929 文献标识码:A 文章编号:1009-3044(2013)28-6322-05
随着互联网的发展,浏览器逐渐成为新一代浏览网络资源的工具。由于苹果的市场份额越来越来越大,采用iOS系统的智能手机市场份额越来越大,为了能够方便用户在手机上浏览网页,浏览器Safari的iOS客户端的开发也就应运而生。同时Safari 先进的新功能令它成为遨游网络的绝佳方式。Safari 的搜索如今更智能,可以让你更迅速地找到所需网页。而且,它还会以精彩的新方式为你显示所有打开的标签[1]。由于iPhone、iPad、itouch在国内市场份额较大,而且苹果提供给开发者成熟的开放API接口和完善的SDK开发包,以及大量的第三个库。 能够方便开发者很快的做出自己的Safari浏览器客户端应用[2]。
1 关键技术
1.1 Xcode开发环境
我们通常使用Xcode开发苹果软件应用程序, 自4.0开始,开发人员用Xcode开发基于iOS的iPhone、iPod Touch 、iPad设备应用程序,程序员通常在Mac OS X 10.6.2 以上版本 Mac OS 操作系统上安装iOS SDK,程序员可以使用 Xcode把应用程序部署到iOS设备上,Xcode提供的应用程序开发环境友好而方便, Xcode支持多种语言进行程序设计,比如说:C、C++、Objective-C、Java。另外,Xcode 的编译速度也极快 [3]。
2 需求分析
Safari浏览器是一款功能强大的浏览器,主要完成的功能为快速浏览网页,添加本地书签,添加分组,多网页之间的交互与他们之间的切换。具体系统需要完成的功能主要有以下几点:
1)利用Safari中的标签浏览。
2)只需一次点击开启独立窗口界面。
3)Safari在所有地方都令文本美观而易于阅读。
3 系统设计
本系统的框架图如图1所示,应用层即为搜索页面,支撑系统的数据库和图形显示工具包是Sqlite和搜索结果视图。对用户搜索的页面的结果进行显示时,Sqlite作用是用来存储历史数据。Sqlite占用资源极少,在设备中只需要几百KB内存就够了,并且处理速度比大部分的普通数据库都要快,所以本系统采用了Sqlite数据库。搜索结果的页面主要由系统提供的API来实现,将网页、图像、文字呈现出来。
3.1功能模块设计
本文Safari浏览器分为五个基本功能模块:网页模块、书签模块、阅读列表模块、分组模块、历史记录模块、分页浏览模块。本系统的功能模块图如图2所示。
4 系统详细设计
4.1 系统整体流程
在系统开始时需要对数据库进行初始化,如果没有数据库,那么创建数据库,如果数据库已经存在,那么使用应经存在的数据库为之后的一切程序活动做好准备。如图所示:首先打开浏览器,输入网址,点击回车加载网页,浏览网页的过程中保存历史记录,若需要添加书签,则进行添加书签的操作。
在整个系统的过程中,初始化工作,数据处理和显示过程做好准备,打开数据库,方便数据处理操作,方便面程序数据的加载。系统开始启动,初始化以及加载网页的过程,主要是对核心资源进行配置和加载,一旦失败,必须反复加载直至成功。不能直接退出系统。本系统流程图如图3所示。
4.2书签模块
书签模块主要完成的是添加书签、删除书签、已经载入书签的操作,通过书签加载网页,完成后将网页显示在屏幕上,添加书签,首先存储在内存中,然后将网页的信息通过书签写入Sqlite数据库中,从而实现数据的持久化。同样,删除书签也是将对数据库进行操作,将书签从Sqlite数据库中删除。加载书签,用户点击书签的单元格后,Webview读取出书签中存数的url,开始加载网页,将网页的内容显示到屏幕中,至此完成书签添加,书签删除,载入书签的操作。
4.3数据库设计
E-R图如图5所示为本系统数据库E-R图。本系统的数据库实体主要有书签信息和分组信息。
如图5所示,每个书签中都包过网站名和王网站地址两种信息,每个书签对应一条自己的基本信息。
4.4 数据表设计
基本信息user表 如表1所示基本信息所含三个属性。
5 系统编码与实现
5.1 书签、分组、历史记录管理模块
创建UITableView加载表视图,将表视图分为两部分,两部分的section分别为0、1。0表示呈现以组为单位的cell,而1表示以书签为单位的cell。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * CellIdentifier = @"Cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
}
if (indexPath.section == 0) {
NSString * str = [[groupArray objectAtIndex:indexPath.row]valueForKey:@"image"];
cell.imageView.image = [UIImage imageNamed:str];
cell.textLabel.text = [[groupArray objectAtIndex:indexPath.row]valueForKey:@"name"];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
return cell;}
if (indexPath.section == 1) {
cell.imageView.image = [UIImage imageNamed:@"bookmark.png"];
cell.textLabel.text = [[webArray objectAtIndex:indexPath.row] valueForKey:@"name"];
cell.detailTextLabel.text = [[webArray objectAtIndex:indexPath.row]valueForKey:@"address"];
return cell;
}}
如图6所示,点击历史记录推出历史记录的表示图,可以实行加载历史记录网页的功能,也可以执行删除历史几率的功能。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSString * str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString * filePath = [str stringByAppendingPathComponent:@"fmdb.Sqlite"];
FMDatabase * db =[FMDatabase databaseWithPath:filePath];
if ([db open]){
NSLog(@"***database is opened!");
[db executeUpdate:@"delete FROM User where name=?",[[webArray objectAtIndex:indexPath.row]valueForKey:@"name"]];
[webArray removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
} }
设置返回每一个单元行的样式,。取出数据库中的数据,将其放在一个数组中,最后像是在单元行的View上。判断每一行的是否能被编辑,若能编辑,则可以进行删除和增加的操作。若不能编辑,则不做任何操作。
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0 && indexPath.row == 0) {
HistoryViewController * historyView = [[HistoryViewController alloc]init];
[self.navigationController pushViewController:historyView animated:YES];
[historyView release];
}
if (indexPath.section ==0 && indexPath.row == 1) {
ReadListViewController * readList = [[ReadListViewController alloc]init];
[self.navigationController pushViewController:readList animated:YES];
[readList release];
}
if (indexPath.section == 0 && indexPath.row == 2) {
ICouldViewController * ICould = [[ICouldViewController alloc]init];
[self.navigationController pushViewController:ICould animated:YES];
[ICould release];
}}
6 总结
本文对一个基于IOS的Safari浏览器进行了实现。Safari浏览器推出以后,从世界范围内来看都已得到了广泛的应用,而Safari浏览器也随着iPhone、iPad、等商品的发展有了很大的进步。Safari浏览器在国内外的发展态势良好,对社会的现代化发展有着积极的推动作用。目前,Safari浏览器需求在iOS客户端中中显得愈发重要,Safari浏览器具有非常大的潜在市场,Safari浏览器的使用越来越渗透到人们生活的方方面面,给人们的日常生活带来了巨大的便利。
参考文献:
[1] 齐京. 开发iPhone移动应用程序[J].科技创新导报, 2012(17):9-11.
[2] 科昌.Object-C程序设计[M]. 4版.北京:电子工业出版社,2012:135.
[3] 刘鹏. 基于iOS的个人健康管理系统客户端的开发[D]. 大连:大连理工大学,2012.