XMPP总结1
1. 明确目标,指定计划
在做任何事情之前,如果目标明确,就已经成功了一半!
2. 工程搭建
搭建大体的系统框架
1) 通过Images.xcassets管理应用程序中的图片资源,是支持文件夹管理和拖拽的
2) 如果要发布应用程序,图标文件需要有8个
3) 苹果官方不太支持使用LaunchImage
4) 如果需要兼容iOS6.0的操作系统,不能使用Images.xcassets提供的切片功能,需要使用stretchableImageWithLeftCapWidth对图片进行拉伸处理!
3. 关于多线程
所有UI相关的操作,必须在主线程队列中实现!
在程序开发过程中,千万不要满足NSLog确认流程无误后,就不再继续了!
如果出现这种情况,可以使用 NSLog(@"%@", [NSThread currentThread]); 跟踪调试,判断更新UI的线程是否是主线程!
4. 界面UI交互的细化
* 什么时候,显示什么
* 什么时候,光标出现在什么位置
* 什么时候,可以直接打开键盘
* 什么时候,可以直接自动登录
* 不需要的视图控制器,连显示都不显示
* ......
以上种种界面交互的调整,直接关系到用户对应用程序的体验好坏!是需要长时间磨练的,但是需要我们从现在起,养成习惯,不要大体功能实现就OK!
程序员是一个精雕细琢的工作!在不断的磨练中成长!
5. 关于重构
1) 不要为了重构而重构;
2) 重构只有在需要时,才进行的,如果你的代码运行的很好,同时不需要改动,那么就不需要重构!因为重构是有风险的,很有可能一不小心,把原来正常运行的程序,改的根本运行不了!
3) 如果需要重构,一定要一小步,一小步地进行,幅度越小,风险越小!边重构,边调试。
4) 重构的越早,代码的基础就会越好,后续的延展性会更强!重构的越晚,重构的复杂度越高,甚至永远都无法完成重构!
5) 真正好的重构步骤是基于单元测试驱动的!
6) 重构的目标,让开放的东西越来越少,第三方对自己的打扰就越少,代码越可控!
7) 自己能做的事情,自己做!
8) 如果其他“人”能做的事情,就全权交给对方完成。
9) 通过重构,可以让代码之间解耦,从而系统的扩展性更强!
----------------------------------------------------------------------------------------------------------------------------------------
1. 电子名片(vCard)
首先要打开扩展模块的头文件
#import "XMPPvCardTempModule.h"
#import "XMPPvCardCoreDataStorage.h"
// 获取当前账号的电子名片
XMPPvCardTemp *myCard = [[[self appDelegate] xmppvCardModule] myvCardTemp];
。。。。。。
设置属性
-
或者
-
更新界面UI
。。。。。。
// 更新或保存电子名片
[[[self appDelegate] xmppvCardModule] updateMyvCardTemp:myCard];
电子名片的属性可以参照XMPPvCardTemp.h文件中的声明
提示:如果是NSArray类型的属性,最好进.m文件查看对应的getter&setter方法,确认是否真的实现。
补充:在界面设计上要给用户最大的操作空间,不要把用户限制的过死!
2. 花名册(好友列表)使用XMPP好友列表是可以在服务器上直接设置的,这一特性,非常符合企业级应用的需求
首先要打开扩展模块的头文件
#import "XMPPRoster.h"
#import "XMPPRosterCoreDataStorage.h"
注意:
2.1 XMPPRoster需要添加代理,以自动更新好友信息
_xmppRoster addDelegate
之所以有这个区别,是因为电子名片的修改是用户自发的,而好友信息的修改是其他用户完成的。
2.2 使用花名册的数据是通过NSFetchedResultsController实现数据管理的
具体的使用步骤如下:
1) 获取管理数据上下文
NSManagedObjectContext *context = [[[self appDelegate] xmppRosterStorage] mainThreadManagedObjectContext];
2) 实例化查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];
3)指定排序描述
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
4)实例化NSFetchedResultsController
5)执行查询
[_fetchedResultsController performFetch:&error]
6) 设置表格单元格
XMPPUserCoreDataStorageObject *user = [_fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = user.displayName;
----------------------------------------------------------------------------------------------------------------------------------------
1. 添加好友,XMPP好友机制是一种订阅机制,Subscription
如果要实现快速建议的双向订阅,可以设置XMPPRoster的
autoAcceptKnownPresenceSubscriptionRequests = YES
1) 从客户端内部添加
subscribePresenceToUser:jid
2) 其他客户端发送订阅请求
在XMPPStream的didReceivePresence代理方法中,判断展现类型,如果是订阅,则接受即可
acceptPresenceSubscriptionRequestFrom
2. 删除好友
removeUser:user.jid
3. 在线状态
XMPPUserCoreDataStorageObject中的sectionNum
“0”- 在线
“1”- 离开
“2”- 离线、下线
无论是何种用户状态,都会自动更新XMPPUser...表,APP界面上因为表格已经与NSFetchedResultsController进行绑定,因而无需做任何处理,界面即会自动更新
4. 在XMPP框架中,为了提升用户头像的使用效率,专门引入了XMPPvCardAvatarModule扩展单独处理用户头像
5. 为了提升XMPP应用程序的性能,在APP中可以针对真机开启后台网络访问,以及实体能力扩展
5.1 后台网络访问
// 让XMPP在真机运行时支持后台,在模拟器上是不支持后台服务运行的
#if !TARGET_IPHONE_SIMULATOR
{
// 允许XMPPStream在真机运行时,支持后台网络通讯!
[_xmppStream setEnableBackgroundingOnSocket:YES];
}
#endif
5.2 实力能力只需要注册并激活实体能力的扩展即可
_xmppCapabilitiesCoreDataStorage = [[XMPPCapabilitiesCoreDataStorage alloc] init];
_xmppCapabilities = [[XMPPCapabilities alloc] initWithCapabilitiesStorage:_xmppCapabilitiesCoreDataStorage];