XMPP协议实现即时通讯底层书写 (二)-- IOS XMPPFramework Demo+分析

我希望,This is a new day!

在看代码之前,我认为你还是应该先整理一下心情,来听我说几句:

首先,我希望你是在早上边看这篇blog,然后一边開始动手操作,假设你仅仅是看blog而不去自己对照项目,作用不是非常大。一日之计在于晨,所以怀着一颗对技术渴望,激动的。亢奋的心情去学习。你才干有所得。

嗯,就拿鄙人当时做项目来说,每天早上起来的第一件事情。就是研究XMPPFramework作者的代码,依照模块来分析和模仿书写。睡觉的时候还在思考,分析。总结...

当然我并非说每一个Dev 都要向我这样,仅仅是希望你能保持一颗积极向上的心态去对待技术,对待你的工作。

that‘s all。

ResourceURL:https://github.com/robbiehanson/XMPPFramework  (假设你还在维护你现有的基于XMPP的产品。那么你须要sometimes 去查看,原作者是否fix 一些bug)

IphoneXMPP Demo

1.AppDelegate.m

a.大概看下头文件。ok,别跳转深入看了,以下我会教高速的看。See this method

有几个地方须要注意:

1)DDLog 用于不用不强求,鄙人喜欢干净清爽的控制台。所以就没用这玩意,由于我并非非常依赖所有打log。而是断点控制台po XXX方法,实时性找出问题修复bug

2)配置XML Stream 流 ,给你的长连接里面添加各种 buff。各种装备,各种属性。ok,不开玩笑了:),这个配置非常重要,它决定了你的app须要支持哪些xmpp服务,决定了原作者(罗宾逊)哪些代码功能模块是不须要生效的

3)启动连接,当然相应的也有一个cancel connect

b 设置你的 XML Stream 。开启哪些功能

- (void)setupStream
{
	NSAssert(xmppStream == nil, @"Method setupStream invoked multiple times");

	// Setup xmpp stream
	//
	// The XMPPStream is the base class for all activity.
	// Everything else plugs into the xmppStream, such as modules/extensions and delegates.

	xmppStream = [[XMPPStream alloc] init];

	#if !TARGET_IPHONE_SIMULATOR
	{
		// Want xmpp to run in the background?

//
		// P.S. - The simulator doesn‘t support backgrounding yet.
		//        When you try to set the associated property on the simulator, it simply fails.
		//        And when you background an app on the simulator,
		//        it just queues network traffic til the app is foregrounded again.
		//        We are patiently waiting for a fix from Apple.
		//        If you do enableBackgroundingOnSocket on the simulator,
		//        you will simply see an error message from the xmpp stack when it fails to set the property.

		<span style="color:#66ff99;">xmppStream.enableBackgroundingOnSocket = YES;</span>
	}
	#endif

	// Setup reconnect
	//
	// The XMPPReconnect module monitors for "accidental disconnections" and
	// automatically reconnects the stream for you.
	// There‘s a bunch more information in the XMPPReconnect header file.

	xmppReconnect = [[XMPPReconnect alloc] init];

	// Setup roster
	//
	// The XMPPRoster handles the xmpp protocol stuff related to the roster.
	// The storage for the roster is abstracted.
	// So you can use any storage mechanism you want.
	// You can store it all in memory, or use core data and store it on disk, or use core data with an in-memory store,
	// or setup your own using raw SQLite, or create your own storage mechanism.
	// You can do it however you like! It‘s your application.
	// But you do need to provide the roster with some storage facility.

	xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
//	xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] initWithInMemoryStore];

	xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterStorage];

	xmppRoster.autoFetchRoster = YES;
	xmppRoster.autoAcceptKnownPresenceSubscriptionRequests = YES;

	// Setup vCard support
	//
	// The vCard Avatar module works in conjuction with the standard vCard Temp module to download user avatars.
	// The XMPPRoster will automatically integrate with XMPPvCardAvatarModule to cache roster photos in the roster.

	xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
	xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage];

	xmppvCardAvatarModule = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:xmppvCardTempModule];</span>

	// Setup capabilities
	//
	// The XMPPCapabilities module handles all the complex hashing of the caps protocol (XEP-0115).
	// Basically, when other clients broadcast their presence on the network
	// they include information about what capabilities their client supports (audio, video, file transfer, etc).
	// But as you can imagine, this list starts to get pretty big.
	// This is where the hashing stuff comes into play.
	// Most people running the same version of the same client are going to have the same list of capabilities.
	// So the protocol defines a standardized way to hash the list of capabilities.
	// Clients then broadcast the tiny hash instead of the big list.
	// The XMPPCapabilities protocol automatically handles figuring out what these hashes mean,
	// and also persistently storing the hashes so lookups aren‘t needed in the future.
	//
	// Similarly to the roster, the storage of the module is abstracted.
	// You are strongly encouraged to persist caps information across sessions.
	//
	// The XMPPCapabilitiesCoreDataStorage is an ideal solution.
	// It can also be shared amongst multiple streams to further reduce hash lookups.

	xmppCapabilitiesStorage = [XMPPCapabilitiesCoreDataStorage sharedInstance];
    xmppCapabilities = [[XMPPCapabilities alloc] initWithCapabilitiesStorage:xmppCapabilitiesStorage];

    xmppCapabilities.autoFetchHashedCapabilities = YES;
    xmppCapabilities.autoFetchNonHashedCapabilities = NO;

	// Activate xmpp modules

	[xmppReconnect         activate:xmppStream];
	[xmppRoster            activate:xmppStream];
	[xmppvCardTempModule   activate:xmppStream];
	[xmppvCardAvatarModule activate:xmppStream];
	[xmppCapabilities      activate:xmppStream];

	// Add ourself as a delegate to anything we may be interested in

	[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
	[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];

	// Optional:
	//
	// Replace me with the proper domain and port.
	// The example below is setup for a typical google talk account.
	//
	// If you don‘t supply a hostName, then it will be automatically resolved using the JID (below).
	// For example, if you supply a JID like ‘[email protected]/rsrc‘
	// then the xmpp framework will follow the xmpp specification, and do a SRV lookup for quack.com.
	//
	// If you don‘t specify a hostPort, then the default (5222) will be used.

//	[xmppStream setHostName:@"talk.google.com"];
//	[xmppStream setHostPort:5222];	

	// You may need to alter these settings depending on the server you‘re connecting to
	customCertEvaluation = YES;
}

ok,let‘s begin.

1)创建一个XML stream 对象。这货是干嘛的呢。打个比喻:货物运输带。上货和下货 都要靠这条带子。谁让这条带子动起来?

长连接

它就是个马达。

那么这里面的货是啥呢?3种货:美版。港版。日版,偶尔带点国行。(*^__^*) 嘻嘻……,哈哈不开玩笑了。有三种货:<iq> <p><message>,偶尔带点其它标签<a><r>什么的。

索达斯内!

~斯ko一!~是的,好厉害好棒哒!~发现昨天看得RFC6121有点关系啦。~\(≧▽≦)/~啦啦啦

2)是否开启后台模式---NO。除非你有VOIP须要支持,不然后患无穷,如今github 上后台issue另一大堆没解决的呢,反正呢非常复杂哒。我这菜逼就没支持这货

<span style="color:#66ff99;">xmppStream.enableBackgroundingOnSocket</span>

3)开启重连机制(长连接必备,心跳啥的)

开启roster(两种形式:coreData存储 or 开辟内存--暂时对象存储),自己主动获取server上的roster数据?是否自己主动应答 已经存在订阅出席消息的小伙伴的订阅请求。也就是说是否自己主动过滤掉已经订阅过的订阅或者是已经形成订阅关系的用户请求啦(难点。后面章节细讲)。开启roster CoreDataStorage,也就是数据库存CoreData储技术。

开启vCard(个人信息详情) module。二次封装vCard Module开启,而且启动 vcard相应的coreData 存储技术

开启capabilitie,和与之的存储技术。这货当初看了好久哒。可是如今真忘记了。

。。sorry,这块须要找相应的XEP来进行脑补,只是貌似临时用不到。就让它默认吧。

原文链接传送门

以下是 XMPPFramework的一个核心:multi delegate (作者独有。膜拜!

~)

[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
	[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];

对XML stream 进行加入一个Sub Delegate回调,在当前Class。在mainThread Queue中,

对roster 进行一个sub delegate回调,在当前Class,主线程队列。

关于multi delegate 技术。建议好好看看里面的详细实现。不要求你会写,大概的核心思想能看懂就成,会return BOOL YES or NO 就可以。

btw1:鄙人对这个multi delegate再次膜拜。当然他写的非常多东西。都是让我膜拜的。。

比方socket链接。。。

XML解析。DDLog。。

。反正好多,好了不说了。说多了都是泪,菜狗仅仅能仰望大神。。

btw2:刷刷刷两个小时过去了,洗洗睡了,写blog真心非常累。

btw3:server那个水?问你呢。你们环境配好了没,我这边要example測试连接了。快给个账号和password。劳资效率就是这么高。一天搞定主要的数据连接了。

btw4:经理,我这边还算顺利,约有小成,你看这连接界面,成了,尽管界面丑了点,可是能连上服务端了,真棒。

btw5:啪!你个傻蛋。别说这事demo,怎么有你这样的队友。

btw6:下期预告<IOS XMPPFramework --IM底层架构设计+技术准备工作>

时间: 2025-01-03 22:25:37

XMPP协议实现即时通讯底层书写 (二)-- IOS XMPPFramework Demo+分析的相关文章

XMPP协议实现即时通讯底层书写 (三) IOS XMPPFramework --IM底层架构设计+技术准备工作

最近发生了一些不是很愉快的事情,导致断更很长一段时间,很抱歉."不要炫技,理解原理,对自己的代码负责,才能对团队和项目负责"--郭前辈在群里说过的语录,让我很是欢喜和受教.鄙人写第一次写blog是在2011年,那时候写技术blog的初衷是为了写日记:今天我学到了什么知识,技术,记录自己程序猿的成长点滴.随着技术的积累,写blog为了分享:傻逼,如果你也碰到这种问题,这是我的解决方案,看了这些XXX处理好的,可以"抄"这份60分的答案来解决问题.到现在这阶段,写blo

XMPP协议实现即时通讯底层书写 (一)--从RFC6121阅读开始

Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence ok,额瑞巴蒂,说好的阅读RFC6121开始了.希望在阅读此文之前,已经跟你的leader在时间上沟通好了.那么这篇文章在介绍RFC6121的同时,我会穿插一些自己当时总结到得阅读技巧分享给大家(不喜轻喷). 在阅读每个协议之前,每个协议,请静下心来阅读一下这最重要的Abstract.是的,要保证你理解它的内容中每个词语的意思,因为这

开发手记——基于XMPP的Android即时通讯APP(二)

隔了几天,把应用的登录.注册部分做的比较完善了,当然这只是个人感觉哈. 今天要说的,都是干货! 首先,没有大片代码:其次,在网上一般找不到:最后,真的让你节约开发时间!这也是为什么时隔好几天才会发第二篇连载. 既然说,没有大片代码,一般的登录.注册流程这里就不提了,百度谷歌一搜一大堆,而且基本都能用.这里说几点注意 [一]关于后台服务: 官方的建议,要使用"START_STICKY"这种类型的后台服务.为什么要用这种服务,官方的说法很明朗: 这点和Android Developer官网

.net平台 基于 XMPP协议的即时消息服务端简单实现

.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具所以也算是打一个基础吧!如果你还没有了解过XMPP请先阅读附录中链接的文章,本实例是基agsXMPP上开发的,agsXMPP是C#写的支持开源XMPP协议软件,我们可以在agsXMPP上快速构建自已的即时通讯平台,我的这个例子只是修改了服务器端,因为agsXMPP本身自带的服务器端没有实现聊天功能.

开源jabber(XMPP)架设内部即时通讯服务的解决方案

Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Internet上应用,也可以在局域网中应用.    XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测.它在促进服务器之间的准即时操作.这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同.XMPP的技术来自于Jabber,其实它是 Jabber的核心协定,所以XMPP有时被误称为Jabber协议

android实现基于TCP和UDP协议的即时通讯,含android端和服务器端

这几天学习了下在android中实现即时通讯的方法,一开始,自然是从基本的网络协议中开始尝试了,这样能够最大化的私人订制自己的应用,还能学习到更多的知识,好处多多,接下来就简单介绍下两种协议的不同点吧 TCP协议:提供IP环境下的数据可靠传输,它提供的服务包括数据流传送.可靠性.有效流控.全双工操作和多路复用.通过面向连接.端到端和可靠的数据包发送.就如给悬崖上的两人通信时,他必须先把桥建好,确认桥是没问题的情况下,才把信件交过去,以后大家每次通信时,都确认下桥没什么问题,再通过这座桥来回通信了

开发手记——基于XMPP的Android即时通讯APP(一)

2015年已经走过了一个月的光景,在一月份,分享了两套视频教程.我个人看过了其中一些,还是很不错的,就是讲课的老师语速慢了点,偶尔有点发困,不知看过的朋友会不会有同感,呵呵. 关于已经开始的XMPP即时通讯客户端实际上一直是想完成的一个项目,只是一直被工作所困扰,一直没得空.好在现在有点时间,就忙里偷闲了. 那么作为第一篇文章,自然是开发环境的搭建和开发的前期准备.或许代码量不多,或许文章内容还显得很稚嫩,所以欢迎各位前辈前来拍砖,我喜欢板砖! 首先是服务器部分: 这部分不会介绍太多,因为我们的

开发手记——基于XMPP的Android即时通讯APP(三)

首先祝各位读者新年快乐,博主在这里给大家拜万年啦!而且马上要到元宵节,顺祝大家元宵节快乐! 上一次谈了注册和登录的编码技巧,这一次我们来谈谈加好友的技巧. [搜索用户]: XMPP协议为我们提供了完善的好友查找功能,而且通过aSmack的库,能够轻易实现模糊查找功能.为了保证应用程序的通用性.在搜索时,我们最好按如下的方法做: UserSearchManager usm = new UserSearchManager(xmppConnection); Form searchForm = usm.

XMPP(三)-安卓即时通讯客户端

由于时间原因,所以更新比较慢 ,还请大家谅解,此次是对上篇文章中的安卓客户端初级版本进行的一次更新优化,在这次更新后,就有那么一点样子了,可以拿的出手了,呵呵,还在关注的同学也可以及时下载更新.此次主要更新的内容如下: 1,聊天界面,新消息到来时,聊天界面同步刷新: 2,聊天界面,支持长按聊天记录时删除或复制聊天记录,及清空与该用户的全部聊天记录: 3,消息界面,支持长按某一会话,删除与该用户的会话记录: 4,支持消息未读数量显示(底部导航栏为总未读数,会话记录处为与该用户的聊天的未读消息数):