我是用的smack sdk 版本是4.3.4,? openfire版本是4.5.1,? ?PC端用的是spark
首先是常用的幾個類:
Jid:XMPP的地址叫做JabberID(簡寫為JID),它用來標(biāo)示XMPP網(wǎng)絡(luò)中的各個XMPP實體。JID由三部分組成:localpart、domainpart 和 resourcepart。? ? ? ? ? ? ? ? ? ? ? ? ? 例如? 張三@127.0.0.1/8uf3ehbxo9。代表著客戶端的一個實體用戶。? ?localpart:用戶的登錄名? ???domainpart:服務(wù)器域名? ??resourcepart:代表著用戶登錄? ? ? ? ? ? ? 設(shè)備或者某個節(jié)點的id。
JID子類:在smack中還有很多種的jid子類,其功能基本上相同,就是在組成的格式上會有不同:例如:張三的歌@conference.127.0.0.1/張三,其對應(yīng)的就是:聊天群的名稱 @conference.? 主機名 / 用戶的群內(nèi)昵稱。不同種類的jid使用的場景不同,但是代表的內(nèi)容基本就是這種格式。

? XmppTCPConnection:客戶端和服務(wù)器的連接類,主要是通過XMPPTCPConnectionConfiguration.Builder類設(shè)置:服務(wù)器主機名,服務(wù)器的IP地址,使用端口(常規(guī)使用5222)等。
AccountManager:賬戶管理者,主要用來注冊賬戶、修改密碼、刪除賬戶,獲取賬戶含有的屬性名稱(或者說是對應(yīng)的字段名:例如郵箱對應(yīng)的是email)等。
Roster:翻譯為花名冊,我個人理解就是用戶的實體對象,表示一個單獨的用戶,這個類比較重要。使用場景較多。
Presence:多用來表示和設(shè)置賬戶的狀態(tài)(上線、離線、忙碌),和好友的關(guān)系(多在添加好友時使用)等。
roster.addSubscribeListener():為當(dāng)前用戶添加訂閱監(jiān)聽,當(dāng)有人對當(dāng)前用戶發(fā)起訂閱時響應(yīng)
roster.addPresenceEventListener():為當(dāng)前用戶添加Presence狀態(tài)變化的監(jiān)聽。
UserSearchManager:顧名思義,用戶搜索
//需要經(jīng)過同意才可以添加好友
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
添加好友流程:通過百度得到大多數(shù)都是通過??Roster.createEntry(EntityBareJid,“昵稱”,“分組名,可以為空”)的方式來發(fā)送邀請,然后通過Presence修改用戶和好友的訂閱狀態(tài)來進行添加。但是我在實際操作中發(fā)現(xiàn)了問題,就是對方不同意添加好友的時候,發(fā)起用戶已經(jīng)將對方添加為自己好友(除非是監(jiān)聽到對方不同意時,再將對方刪除),這就會造成在對方每次登錄的時候,都會收到當(dāng)前用戶的訂閱通知。所以我的添加流程是 :1、發(fā)送好友申請(roster.sendSubscriptionRequest(jid))? 2、等待對方回應(yīng)(Presence.Type.subscribed:同意,Presence.Type.unsubscribed:拒絕) 3、對方同意后再添加為好友(Roster.createEntry()),拒絕的話不做響應(yīng)。
ChatManager:在線聊天的管理者。chatManager.addIncomingListener()接收到的所有好友聊天消息的監(jiān)聽,可管理在線聊天的消息數(shù)量展示和單獨聊天的消息接收
OfflineMessageManager:離線消息的管理者。我們一般是在登錄后獲取當(dāng)前用戶的離線消息,然后服務(wù)器刪除。需要注意的是,對用戶狀態(tài)的改變,必須是在獲取完離線消息后,在將賬戶狀態(tài)設(shè)置為在線,否則我們將收不到離線消息或者數(shù)量為0。
VCard:用戶的個人信息卡,例如昵稱,頭像,家庭住址,手機,email等等,需要單獨創(chuàng)建。需要注意的是,我之前是在注冊的時候進行創(chuàng)建,但是提交完成后,沒有對應(yīng)的信息(對應(yīng)字段內(nèi)容為null)。測試后發(fā)現(xiàn),只有在用戶登錄完成后,進行提交后,才會有效。提交方式有兩種? ,1、 VCardManager.saveVCard(vcard)? ? ? 2、vcard.save()
未完待續(xù)。。。。。。。