手机端聊天工具的设计与实现

2015-07-26 02:29任靖娟
微型电脑应用 2015年8期
关键词:用户名视图代码

任靖娟

手机端聊天工具的设计与实现

任靖娟

针对如何在IOS平台创建即时通讯软件,使用object-c语言在xcode上编写和调试IOS程序,接下来xmpp框架的导入和各种效果的实现,最后,介绍了程序的设计思路和模式(如MVC模式)。

IOS openfire XMPP ASIHttpRequest 通讯

0 引言

随着智能手机的问世,人们不再仅限于使用手机的短信和通话功能。人们开始倾向于使用手机软件来通信,于是实时通信软件不断被开发和优化。实时通信软件比短信服务(SMS)更加方便和实用,因此人们更加喜欢用通信软件进行通信[1]。

下面介绍怎样用Objective-C语言来实现基于iPhone端的实时通讯软件,使用当前最流行的UI设计元素,而且有良好的功能实现和用户体验。

1 整体框架设计

系统设计的任务是设计软件系统的模块层次结构,设计数据库的结构以及设计模块的控制流程。此软件主要采用MVC的设计模式,把所有的逻辑分别归类到M:模型V:视图C:控制器中,使整个程序更加明晰。

1.1 系统功能分析

在这个过程中服务器端数据库要及时准确地存储、检索相应的数据,该软件的需求如下:

(1)注册:把用户名和密码传给服务器,服务器存入数据库;

(2)登陆:把用户名密码传给服务器,服务器进行匹配,返回结果;

(3)显示联系人:从服务器获取当前在线联系人,返回到客户端,得到数据后填充到界面上;

(4)添加好友:发送当前用户的用户名,服务器把数据存到自己好友的表中;

(5)好友列表:从服务器得到好友的数据,服务器遍历好友表,返回结果;

(6)发送消息:当用户在线时把消息发送到服务器,服务器转发给联系人;

(7)收到信息:当服务器收到消息,消息中带有目的位置,服务器把消息转发到目的位置;

(8)消息记录:发送的消息和收到的消息被及时的存入到了数据库,可以实现聊天记录的查看;

(9)刷新:当下拉列表时调用下拉方法,再次请求服务器,知道得到数据后收起加载页面,使得第一条数据永远是最新的数据;

(10)注销:点击注销,调用下线的方法,断开连接。1.2 系统功能结构

该系统分别部署到两台服务器上,一个数据服务器一个聊天服务器。数据服务器存储用户登陆的信息和相关内容,聊天服务器完成聊天数据的转发C/S (Client/Server,客户端/服务器)[2]结构,即客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的 Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。本软件采用了C/S设计结构,客户端主要功能图列出了客户端的主要功能。如图1所示:

图1 客户端主要功能图

注册功能:用户在移动设备上点击软件图标后进入当前程序页面,进入主界面后,如果已有账号则可直接点击登陆,如果没有账号,点击登陆页面后,会出现注册按钮,点击注册按钮输入用户名和密码系统会提示注册成功或失败,如果提示成功则注册成功,如果失败则提示注册失败。

登陆功能:如果已有账号输入用户名密码以完成登陆操作,如果没有账号,注册成功后,注册的用户名和密码会留在输入框中,直接点击登陆按钮即可完成登录,点击登录按钮以后系统会提示成功或失败,如果登陆成功系统跳进主界面如果失败系统提示登陆失败。

朋友功能:朋友界面是用户在发现页面中添加的好友都会显示在朋友页面,当点击任意一行,即可与当前联系人进行聊天。

发现功能:发现界面中的数据都是来自openfire数据库中的ofuer表[3],里面存了所有的注册用户,当点击发现时客户端请求服务器,服务器返回当前在线的用户,

消息功能:当和朋友发生联系后,所有的聊天数据都会存入到消息界面。

注销功能:点击注销按钮后,系统会退出登录状态。

服务器主要功能图,列出了服务器端的主要功能,如图2 所示:

图2 服务器主要功能图

(1)tomcat服务器:tomcat服务器主要完成业务数据的操作,把图片和用户名、密码存入数据库,并把存用户名和密码的表中的数据复制到openfire数据库中的ofuser表中。

(2)Openfire服务器:openfire服务器主要完成聊天数据的转发,这种数据服务器和聊天服务器分开设计从而实现了高并发量。

(3)当用户发送消息数据会存到hacpi的message表中,

(4)当用户登录时,post用户名和密码到openfire服务器,当验证通过后,调用xmpp的已通过验证的代理方法。

2 关键技术功能实现与创新

2.1 Xmpp框架导入IOS工程

(1)从github下载xmpp[4]框架导入工程,如图3所示:

图3 导入工程图

选中的文件拖入工程中,其中Extension中的模块可以选择添加(只添加当前工程需要的模块)xmppframework设计是模块化的,包括核心和扩展,第三方开发人员可以方便的添加自己的扩展实现;同时开发人员也只需要添加自己工程需要的模块。一般扩展都会依赖一些额外的包, 要注意同时添加进去。

(2)添加framework 选择工程/选择Build Phases/Link Binary With Libraries点加号添加,需要添加的库包括(注意根据你添加的模块不同,可能需要添加的库不一样)如图4所示:

图4 链接库图

(3)添加一个搜索路径如图5所示:

图5 引用文件路径图

(4)创建 xmpp对象并实现它的代理方法,初始化xmppStream 设置xmppStream的deleagte实现goOnLine方法完成在线状态的发送,实现goOffLine方法完成下线方法的发送。实现connect方法从本地获取用户名、密码和服务器地址,通过xmppStream的setMyJID方法设置用户名,通过setHostName方法设置服务器地址,连接服务器如果成功返回yes,连接服务器后会调用xmppStreamDelegate的方法xmppStreamDidConnect连接服务器,如果成功电泳验证方法,如果验证成功调用xmppStreamDidAuthenticate,验证通过后即可调用上线的方法上线,上线后即可发送消息和收到消息[5]。

2.2 FMdataBase

FMDB框架其实只是一层很薄的封装,主要的类也就两个:FMDatabase和FMResultSet[6]。

(1)首先,得实例化一个 FMDatabase对象,这跟Sqlitepersistentobjects 派生一个子类进行操作是不同。接着打开一个数据库(如果没有会创建一个数据库),paths:ios下Document路径,Document为中ios可读写的文件夹,创建数据库实例 db 这里说明下:如果路径中不存在“Test.db”的文件,sqlite会自动创建“Test.db”。

(2)接下来,我们可以通过这个数据库对象进行操作了。操作主要是update和queries。

(3)这样我们就有了一张表了。接下我们对表进行操作。插入数据!注意插入的数据使用了通配符,这跟 iphone直接使用sqlite借口的绑定变量是一样的,后面的通配符匹配的数据。

(4)把数据存入数据库中,插入数据库中。(5)对数据库进行查询操作。

2.3 SBJson的使用

SBJson是Objective-C实现的一个JSON解析器和生成器。JSON是一种数据交换语言,和XML是同样用途的。不过JSON的体积要比XML小,也就意味着在网络传输中速度会比XML更快。

JSON(JavaScriptObject Notation) 是一种轻量级的数据交换格式[7]。它基于 JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是,也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

在项目如果要解析json字符串需要创建json对象,调用objectWithString:方法完成json串的转换。

2.4 自定义Cell的使用

创建一个UITableViewCell的子类[8]:选中Custom Cell目录,依次选择File/New /New File,在弹出的窗口,左边选择Cocoa Touch,右边选择Objective-C class,单击Next,输入类名CustomCell,Subclass of选择UITableViewCell,之后选择 Next和 Create,就建立了两个文件:CustomCell.h和CustomCell.m。

(1)创建CustomCell.xib:依次选择File/New/New File,在弹出的窗口,左边选择User Interface,右边选择Empty,单击Next,选择iPhone,再单击Next,输入名称为CustomCell,选择好位置,单击Next,选择iPhone,再单击Next,输入名称为CustomCell,选择好位置,拖拽自己想要的控件。

打开CustomCell.h,添加属性,打开CustomCell.m,向其中添加代码。

设置重用标志,使得cell可以重用。

在表的代理方法里创建cell对象,并对视图赋值。

本程序中用到的自定cell的类都放在了cell文件夹里,里面是所有要用的cell,自定义cell可以让用于看到不同形式的表视图,增加了内容的阅读行,使得 ui多样化,能使整个程序更加美观。

3 设计思想

3.1 编码风格

本软件的编码风格严格按照 Objective-C[9]的编码规范,并注意编写时的细节,增加代码的清晰度和易读性。

(1)类名:

①所有的类名均以大写字母开头,多单词组合时,后面的单词首字母大写,类是有意义的。使用驼峰命名法,方法名全部都有特定的涵义和目的,参数和方法都有注释。

②所有继承自系统的某类则用某类的名字作为结尾。例如继承自 UIView 的类以 View 结尾,继承自ViewController[10]的类以viewController结尾,表示是视图控制器。

③所有保存数据的实体以 object结尾,并放在 model文件夹中。

(2)常量:

所有的常用数据都进行了宏定义,放在了预编译头文件中,当某个类中需要用到的时候,直接调用宏就行。在Define中相类似的定义要对齐。如:

(3)变量:

①变量必须起有意义的名字,使其他组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,第一个单词首字母小写,其他单词首字母大写。

例如:NSString *username;

②对于一些特殊类型的变量,命名时要带上类型,如NSArray的变量命名为xxxArray,其他的如xxxDictionary,xxxSize等。这样就可以从名称上知道是什么类型的变量。

③对于要和interface builder关联的的输出口变量,命名时要后缀以特定的控件名。

例如:IBOutlet UILabel *userNameLabel;

④尽量避免使用全局变量,使用全局变量时,在变量前加一个下划线,如_dishesArray。

(4)方法:

①方法的名称使用有意义的单词组成,且以小写字母开头,多单词组合时,后面的单词首字母大写。

例如:-(void)getDishDetail

②设置类变量的内容的方法应使用set作为前缀,读取变量的内容的方法应使用get作为前缀。

例如:-(void)getDishes;

③方法中的参数:第一个参数名称要从函数名称上携带出来,第二个参数的首字母小写,多个单词组合时,后面单词首字母大写。参数有别名时,参数别名与参数名一致,但参数名前缀以_。参数别名与前一参数保留1个空格。参数无别名时,以有意义的字母命名。

例如:

-(void)getDishWithOffest:(NSString *)aOffest limit:(NSString *)aLimit;

(5)方法的定义:

①所有的私有方法和属性全部定义在.m文件中。

②所有的共有方法和属性全部定义在.h文件中。

③建立工具类jxxmpp来完成所有xmpp相关的操作。

④使用委托和通知来完成消息的传递。

3.2 编码思想

在编码中主要采用的是面向对象的思想进行源码实现的[11]。面向对象的设计方法使得代码结构好且效率高,例如在解析服务器返回的json数据时,将同属于一个字典的属性放到一个数据模型类中,在这个数据模型类中有若干属性,用于保存该模型在数据库中的各个字段。在该模型类中实现数据的具体解析,在不同的地方使用的时候,只需要调用该模型类的属性即可。这样,减少了重复代码,也使得代码的结构更加清晰。

在面向对象设计中,编码时我还注意使用了各种设计模式:MVC模式、工厂模式、观察者模式、代理模式和单例模式。

MVC[12]全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

MVC模式:即模型、视图、控制器。模型主要负责数据的存储,视图主要负责不同视图效果的显示,控制器主要负责不同视图的承载和切换。这样做的好处有:①降低代码的耦合性,实现数据层、视图层和业务层的分离。视图层和业务层分离,就能允许更改视图层代码而不用重新编译模型和控制器,同样,一个应用的业务流程或者业务规则的改变之需要改动MVC的模型层即可。②高重用性和实用性,例如在工程中要实现用新浪微博、豆瓣、QQ3种方式登录,根据用户的选择,改变不同的 WebView,使用同一个viewController,达到了重用的目的。③增加可维护性,由于不同的层各司其职,每一层的应用具有某些不同的特征,有利于代码的管理、维护。

观察者模式:在此种模式中,一个目标物件管理所有相依于它的观察者物件,让多个观察者对象同时监听某一主题对象,这个主题对象在状态上发生变化时会通知所有的观察者对象,使他们能够自动更新自己。例如在工程中,当屏幕旋转时发出通知,此时,viewController就能够接收到通知,在需要旋转的viewController中写相应的代码就可以试想不同的视图效果。

4 总结

本项目通过使用结构化分析方法进行了需求分析、可行性分析、概要设计、详细设计,用业务流程图、数据流图和功能结构图清晰地得到了软件的模块结构。在设计过程中,从整个程序的结构出发,利用模块结构图表述程序模块之间的关系。

在功能的实现中,多采用 GCD[13]防止程序卡顿,大大提高了用户体验,使得整个软件更加流畅和完美。

在编码的过程中特别注意运用面向对象分析方法,使代码结构好且效率高,不仅减少了重复代码,也使得代码结构清晰、降低耦合度。在编码过程中,好的编码习惯也是非常重要的,增加了代码的可读性和可维护性。除此之外,各种设计模式的使用也使得程序更加稳定,代码更加可行、高效。MVC模式减低了代码的耦合度,实现了数据层、视图层和业务层的分离;观察者模式定义了一种一对多的依赖关系,在观察者和被观察者之间建立一个抽象的耦合;代理模式解决了某个类不能灵活地完成具体操作的情况;单例模式实现了整个工程内数据的唯一性,可以从内存中直接读取到需要的数据,而避免了频繁地读写本地数据库或者本地 plist文件。在测试时特别注意了不同操作系统和不同分辨率的屏幕的适配的问题。

[1] 刘志富基于xmpp的ios上的IM客户端的研究与实现[D].华南理工大学.2012:3-5.

[2] 詹雄涛.基于MVC模式的移动业务支撑系统设计[J].福建电脑,2008,24(9):136-137.DOI:10.3969/j.issn.1673-2782.20 08.09.084.

[3] 林云.基于 iOS的房产信息系统设计与实现[D].北京交通大学.2013.56-58.

[4] 赵晓燕.基于XMPP协议网站即时通讯系统的研究与实现[D].大连理工大学.2012.23-78.

[5] 周文永.基于XMPP协议的企业级IM关键功能的研究及其在iOS端的实现[D].华南理工大学,2013,12-28.

[6] 李国正.基于手机的移动学习平台的设计与实现[D].新疆师范大学,2010.89-116.

[7] 张涛,黄强,毛磊雅等.一个基于 JSON的对象序列化算法[J].计算机工程与应用,2009,43(15):98-100,133.

[8] Liquan Shen,Zhi Liu,Tao Yan et al.Early SKIP mode decision for MVC using inter-view correlation[J].Signal Processing. Image Communication,2010,25(2):88-93.

[9] Mark Dalrymple,Scott Knaster.Objective-C基础教程[M].北京:人民邮电出版社,2012:13-15.

[10] 陈雯菁.一种基于核心节点的信息安全设备联动协议模型[J].计算机与现代化.2012(12).89-119.

[11] 李小倩.基于 OS架构的在线测试应用软件设计[D].吉林大学.2012.45-89.

[12] 赵晓燕.基于XMPP协议网站即时通讯系统的研究与实现[D].大连理工大学.2012.23-78.

[13] 赖云刚.方云龙.浅析计算机网络环境下单位网络安全和技术[A].巨化集团公司化工学会论文集(九)[C].2011.

TP393.1文献标志码:A

2015.03.18)

1007-757X(2015)08-0022-04

河南省科技厅基础与前沿研究课题(142300410296)

任靖娟(1969-)女,河南省濮阳市人,汉族,硕士研究生,河南中医学院,实验师,研究方向:现代教育技术与多媒体技术,郑州,450046

猜你喜欢
用户名视图代码
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
创世代码
创世代码
创世代码
创世代码
5.3 视图与投影
视图
机智的快递员