李艳艳+杨晨光
摘要:本款旅游软件,旨在为用户提供详细的旅游信息,满足喜欢旅游的用户的需求,为用户提供了各种丰富的功能。整个项目使用基于Foundation框架下得Objective-C语言编写的,使用基于UIKit框架下的UI设计搭建的用户界面来与用户交流,通过使用每个类之间的接口文件关联多个类,使用MapKit框架和CoreLocation框架下来实现地图定位功能,使用讯飞语音实现了语音录入功能,使用本地数据库SQLite存储用户信息以及收藏的景点信息,除此之外还使用Quartz框架,SystemConfiguration框架,CoreFoundation框架等辅助完成本项目。本应用程序以文字和图片相结合的方式生动地为用户展示旅游信息,通过本款应用程序用户可以搜索到自己心仪的景点以及目的地,大大地方便了用户的出行。
关键词:Objective-C;iOS框架;SQLite数据库;第三方类库;地图;科大讯飞
中图分类号:TN929 文献标识码:A 文章编号:1009-3044(2017)06-0223-04
时代在进步,科技在发展,手机的作用已经不仅仅是打电话,发短信,其担任的更重要的角色是人们信息的提供者,所以手机应用行业逐渐成为热门行业,现如今移动应用的开发产业充斥着人们的生活,现在主要的几大移动平台有如下几个:iOS平台、Android平台、mobile web(WAP/XHTML/CSS/Javascript)。其中安卓(Android)具有开放性,多任务,画面流畅,硬件设备性能优良等优点,占据了智能机市场的绝大部分。但是安卓产品的兼容性较差,有些产品华而不实,用户体验较差。就目前而言,其他平台的市场占有率正在呈下降趋势,而近iOS产品的市场占有率正在上升。
随着苹果产品的不断更新,相应的各类应用的开发也越来越火爆。就目前而言,iOS在智能手机的应用软件中的下载量占了33%,另外,iOS平板电脑应用的下载量占据75%,所以,iOS的相关应用软件有着庞大的消费群体。由于iOS的应用够创意,够实用,用户群体庞大,iOS软件发展形势乐观,致使许多开发者投身其中。随着人们生活品质的提高,生活节奏的加快,更加注重诗句感官的效果。基于这种现状,开发一款旅游类的手机应用,为用户提供详细的出行信息,旅游信息的介绍,满足用户足不出户就可以右边全世界的需求是十分符合市场规律的。整个项目使用基于Foundation框架下得Objective-C語言编写的,使用基于UIKit框架下的UI设计搭建的用户界面来与用户交流,通过使用每个类之间的接口文件关联多个类,使用MapKit框架和CoreLocation框架下来实现地图定位功能,使用讯飞语音实现了语音录入功能,使用本地数据库SQLite存储用户信息以及收藏的景点信息,除此之外还使用Quartz框架,SystemConfiguration框架,CoreFoundation框架等辅助完成本项目。
本应用程序的设计目标是开发一款具有界面友好的,注重安全性的,用户体验良好的,易于扩展和维护的手机APP。
1 界面设计
1)推荐界面。分为火热推荐以及趣季推荐两个部分。该界面整体是一个表视图,首页默认显示北京热门地点推荐,用户点击其他城市跳转到相应界面。界面要做到功能齐全,简介不冗余并且简单易于用户操作。
2)目的地界面。该界面是总体介绍世界各地的界面,分为国内城市、热门城市、港澳台、欧洲国家、亚洲国家以及美洲和大洋洲这几大模块,点击每个模块时候跳转到相应的详情介绍界面。
3)主题游界面。该界面整体是一个表视图,展示不同的游玩的主题,点击跳转到详细界面。
4)景点界面。首页默认显示三亚的相关景点列表,在此界面可以直接搜索想要去的景点,也可以选择想要去的城市并展示相应城市的景点列表。
5)我的界面。在此界面显示该项目的一些信息,可以在此界面登录注册、查看收藏信息,清除缓存等。
6)登录界面。登录时需要填写用户名和密码,与数据库中存储的用户信息进行匹配,保证了用户安全。
2 系统模块
整个系统共分为5个打的模块:推荐模块、目的地模块、主题游模块、景点模块、我的模块。每个模块实现的功能介绍如下:
1) 推荐模块。本模块要实现的功能是为用推荐几个热门城市的旅游地点以及户外的旅游信息,首页默认显示北京热门地点推荐,用户点击其他城市跳转到相应界面。在显示户外信息的界面用户可以根据自己的意愿选择想要查看的城市的户外信息。
2) 目的地模块。界面中将世界分为几大模块,每一个模块中包括相应的城市,点击相应的城市之后机会跳转到该城市的景点列表界面,在此界面有地图定位功能,可以查看该景点的周边信息。
3) 主题游模块。该模块为用户提供旅游的主题,每个主题中包含相应的景点信息。
4) 景点模块。该模块是总体介绍世界各地的景点,可以根据自己的意愿进行搜索,搜索时有语音识别功能,说出想要查询的景点即可,方便用户使用。
5) 我的界面。在此界面有登录注册功能,查看收藏信息功能,清除缓存等功能。
通过对项目进行功能需求分析,可以初步确定该项目所需的基本数据。各模块的具体数据需求如下:
1)推荐模块。该模块的数据持久化使用相对应的plist文件实现,此文件中共有8个字典,每一个字典存储一个热门城市的数据,其中url这一个键对应的值就是我们进行网络请求是的链接,同时也是该模块的数据来源。
2)目的地模块。该模块的数据持久化使用DestinationCityList.plist文件实现,此文件中共有8个字典,每一个字典存储一个小模块的数据,其中url这一个键对应的值就是我们进行网络请求时的链接,同时也是该模块的数据来源,由此得到相应模块的城市列表。在城市列表中点击得到的详情页数数据来源于一个公共链接,在此链接中有关数据的字段是我们点击的地点的名称,由此得到相对应的景点信息。
3)主题游模块。
4)景点模块。该模块首页默认显示三亚的景点信息,每个城市都有自己对应的城市ID号,解析根据此ID得到的不同链接从而得到相应的数据,点击城市列表时根据一个城市列表的链接进行数据请求和数据解析得到城市列表的Model类,然后将其中的id属性通过代理回调回传给上个链接的城市id,从而获取不同城市的景点信息。
5)我的模块。使用SQLite本地数据库存储注册的用户信息,以及用户收藏的景点和目的地信息,用户查看时从数据库中调取相应数据。
应用程序致力于为用户提供详细的旅游信息,方便用户出行,围绕这一中心任务,该应用程序用户分为两种:注册用户和游客。
已经注册的用户在使用该应用程序时可以先进行登录操作,然后可以收藏目的地和景点信息,并对其进行修改。注册并已经登录的用户用例图如图1所示:
游客指的是还没有注册的用户,这些用户只能对本应用程序中的信息进行浏览不可以进行收藏操作,可以进行注册登录操作。游客用户用例图如图2所示:
3 系统关键技术
3.1 Objective-C语言
Objective-C,通常写作ObjC和Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统。Objective-c在运行时可以允许根据字符串名字来访问方法和类,还可以动态链接和添加类[1]。
3.2 Foundation框架和UIKit框架
Objective-C中的Foundation框架与Java中的SDK类库相似,是框架的基础,与界面无关,它提供了许多基本的各种基本数据类型、集合、操作系统服务的对象的类,包含了大量的API。
UIKit框架提供一系列的class来建立和管理iOS应用程序的用户界面接口、应用程序对象、事件控制、绘图模型、窗口、视图和用于控制触摸屏的接口等,是基础的UI类库,与Foundation框架是Cocoa框架中的两个比较重要的框架[2]。
3.3 SQLite数据库
SQLite是一款无数据类型的轻量级的嵌入式数据库,具备了基本数据库特性的数据库文件,与其他引擎响应式数据库不同的是SQLite是程序驱动。SQLite包含在一个相对小的C库中,SQLite引擎不是个程序与之通信额独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用[3]。
该项目共有5个模块:推荐模块、目的地模块、主题游模块、景点模块和我的模块。项目总体结构图如下图3所示:
3.4 系统总体流程图
当用户作为游客即未注册用户使用本应用程序时,可以对APP的各个模块进行浏览,当要进行收藏操作时,就会跳到登录或注册界面,完成此项操作后方可进行收藏操作。具体流程图如下图4所示:
3.5 APP的结构设计
3.6 数据请求代码
本应用程序的数据均来自于网络数据,是通过数据链接直接从网上获取的,并非是提前在数据库中写好的固定的数据。网络请求使用GET方式进行请求,然后使用系统提供的JSON方式进行数据解析,主要代码如下:
- (void)setData{
if ([_app internetReachableOrNot]) {
if (self.url == nil) {
self.url = @"http://app.xialv.com/index2.php?a=sList2&page=1&city_id=1001&type=2";
}
NSURL *urlSrting = [NSURL URLWithString:self.url];
self.allDataArray = [NSMutableArray new];
for (NSDictionary *dict in modelDict[@"result"]) {
BJModel *bjModel = [BJModel new];
[bjModel setValuesForKeysWithDictionary:dict];
[self.allDataArray addObject:bjModel];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView.header endRefreshing];
[self.indicator stopAnimating];
[self.tableView reloadData];
});
}
}];
[dataTask resume];
}else{
[self.tableView.header endRefreshing];
[self alertController];
}
}
首先判斷网络是否连接,只有在有网的状态下才会进行数据请求,self.url就是用于数据请求的连接,进行数据请求的步骤是:创建URL对象——>根据URL创建请求对象——>获取当前会话(网络请求的主体内容)——>创建数据请求任务——>启动任务。在数据请求任务中有一个block块,在这里面进行数据解析操作。
需要注意的是block块语法在执行数据请求操作的时候是异步操作(不影响主线程的执行),也就是说程序在执行到block块的时候会同时执行block内部和外部的代码,如果此时在外部要使用block内部请求的数据,数据可能为空,解决这一问题的方法就是在完成数据解析操作之后使用dispatch_async(dispatch_get_main_queue(), ^{})这一方法使程序回到主线程刷新数据,这样就可以正常运行了。
3.7 分享功能
分享使用的是友盟第三方分享,可以将本应用程序的内容分享到新浪微博、豆瓣、人人等交流平台。首先使用CocoPods导入友盟SDK,然后添加相应的依赖库,在需要分享的类中导入头文件#import
NSString *shareString = [NSString stringWithFormat:@"【%@,%@!】%@ 错落的时光里,纷繁的生活中,#时遗#带你体验简单的美好!", self.detailsModel.title, self.detailsModel.viceTitle, self.detailsModel.shareUrl];
[[UMSocialData defaultData].urlResource setResourceType:UMSocialUrlResourceTypeImage url:self.detailsModel.iconUrl];
[UMSocialSnsService presentSnsIconSheetView:self appKey:@"5732cc6b67e58ecfef0010be" shareText:shareString shareImage:nil shareToSnsNames:[NSArray arrayWithObjects:UMShareToSina,UMShareToRenren, UMShareToTencent, UMShareToDouban, nil] delegate:nil];
}
-(void)didFinishGetUMSocialDataInViewController:(UMSocialResponseEntity *)response
{
if(response.responseCode == UMSResponseCodeSuccess)
{
NSLog(@"share to sns name is %@",[[response.data allKeys] objectAtIndex:0]);
}else{
NSLog(@"%d",response.responseCode);
}
提前设置好需要分享的内容,然后UMSociaSnsService调用presentSnsIconSheetView:appKey:shareText:shareImage:shareToSnsNames:方法将需要分享的文字、图片分享到各个平台。
3.8 语音功能
本应用程序提供语音识别功能,需要使用CocoPods导入iflyMSC框架,然后在Appdelegate类中注册初始化语音通讯,在需要使用语音识别的类中导入头文件#import "iflyMSC/IFlyRecognizerViewDelegate.h"、#import "iflyMSC/IFlyRecognizerView.h"以及#import "iflyMSC/IFlySpeechConstant.h",然后需要遵循IFlyRecognizerViewDelegate协议,点击语音按钮之后会调用按钮的触发方法- (void)voiceAction:(UIButton *)button,开始语音识别,然后调用相应的协议方法-(void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast;获取所说的话并将其赋值给搜索文本框,主要实现代码如下:
- (void)voiceAction:(UIButton *)button{
[self.iflyRecognizerView start];
}
-(void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast{
// 获取说话结果中的内容
NSDictionary *dict = [resultArray firstObject];
NSLog(@"%@",resultArray);
for (NSString *key in dict) {
[self.resultString appendFormat:@"%@",key];
}
self.searchBar.text = @"";
self.searchBar.text = self.resultString;
}
本應用程序主要实现了以下基本功能:
1)本应用程序采用MVC模式设计,很好地实现了数据设计和界面设计的分离。
2)使用UIKit框架下的系统类实现了此应用程序的界面设计。分为游客模式和登录用户模式两种。
3)系统分享功能,实现了用户浏览趣季模块时可以将自己感兴趣的内容分享到微博、人人等交流平台的操作。
4)地图定位功能,实现了用户浏览目的地时准确定位景点所在地的操作。
5)收藏功能,实现了已经登录的用户在浏览目的地和景点模块时可以将自己感兴趣或者想去的地方收藏到本地数据库的操作。
6)个人基本资料管理功能,游客可以注册新用户,系统会将用户信息存储在服务器,用户登录的时候会将输入的信息与服务器的数据进行匹配。
在应用程序设计过程中,MVC模式的优势在诸多方面彰显出来,促进了应用程序的开发的进度与效率。
参考文献:
[1] 付红升.基于用户兴趣的手机终端视频推荐系统[D]. 大连:大连理工大学,2014.
[2] 杨丰汀.基于移动设备的图书馆读者社区子系统的设计与实现[D]. 北京:北京邮电大学,2014.
[3] 李小虎.基于Wi-Fi网络的智能导游管理系统设计与实现[D]. 北京:北京邮电大学,2014.