var xs : XMPPStream?
建立通道:
func buildStream(){
xs = XMPPStream()
xs?.addDelegate(self,delegateQueue:
dispatch_get_main_queue
())
}
发送上线状态
func
goOnline() {
let p = XMPPPresence ()
xs !. sendElement (p)
}
let p = XMPPPresence ()
xs !. sendElement (p)
}
发送下线状态
func
goOffline() {
let p = XMPPPresence (type: "unavailabe" )
xs !. sendElement (p)
let p = XMPPPresence (type: "unavailabe" )
xs !. sendElement (p)
}
连接服务器
(
查看服务器是否可连接
)
func
connect() ->
Bool
{
// 建立通道
// 建立通道
buildStream
()
//
通道已经连接
if xs !. isConnected () {
return true
if xs !. isConnected () {
return true
}
//
取系统中保存的用户名
/
密码
/
服务器地址
let user = NSUserDefaults . standardUserDefaults (). stringForKey ( "weixinID" )
let password = NSUserDefaults . standardUserDefaults (). stringForKey ( "weixinPwd" )
let user = NSUserDefaults . standardUserDefaults (). stringForKey ( "weixinID" )
let password = NSUserDefaults . standardUserDefaults (). stringForKey ( "weixinPwd" )
let server = NSUserDefaults.standardUserDefaults().stringForKey("wxserver")
if
(user !=
nil
&& password !=
nil
) {
// 通道的用户名
xs !. myJID = XMPPJID . jidWithString (user!)
xs !. hostName = server!
// 密码保存备用
pwd = password!
do {
try xs !. connectWithTimeout ( 5000 )
} catch _ {
}
// 通道的用户名
xs !. myJID = XMPPJID . jidWithString (user!)
xs !. hostName = server!
// 密码保存备用
pwd = password!
do {
try xs !. connectWithTimeout ( 5000 )
} catch _ {
}
}
断开连接
func
disConnect() {
if
xs
!=
nil
{
if xs !. isConnected () {
goOffline ()
xs !. disconnect ()
}
}
if xs !. isConnected () {
goOffline ()
xs !. disconnect ()
}
}
}
然后就是实现XMPPStreamDelegate代理协议
//
收到消息
func xmppStream(sender: XMPPStream !, didReceiveMessage message: XMPPMessage !) {
// 如果是聊天消息
if message. isChatMessage () {
var msg = WXMessage ()
// 对方正在输入
if message. elementForName ( "composing" ) != nil {
msg. isComposing = true
}
// 离线消息
if message. elementForName ( "delay" ) != nil {
msg. isDelay = true
}
// 消息正文
if let body = message. elementForName ( "body" ) {
msg. body = body. stringValue ()
}
// 完整用户名
msg. from = message. from (). user + "@" + message. from (). domain
// 添加到消息代理中
xxdl ?. newMsg (msg)
}
}
// 收到状态
func xmppStream(sender: XMPPStream !, didReceivePresence presence: XMPPPresence !) {
// 我自己的用户名
let myUser = sender. myJID . user
// 好友的用户名
let user = presence. from (). user
// 用户所在的域
let domain = presence. from (). domain
// 状态类型
let pType = presence. type ()
// 如果状态不是自己的
if (user != myUser) {
// 状态保存的结构
var zt = Zhuangtai ()
// 保存了状态的完整用户名
zt. name = user + "@" + domain
// 上线
if pType == "available" {
zt. isOnline = true
ztdl ?. isOn (zt)
} else if pType == "unavailable" {
ztdl ?. isOff (zt)
}
}
}
func xmppStream(sender: XMPPStream !, didReceiveMessage message: XMPPMessage !) {
// 如果是聊天消息
if message. isChatMessage () {
var msg = WXMessage ()
// 对方正在输入
if message. elementForName ( "composing" ) != nil {
msg. isComposing = true
}
// 离线消息
if message. elementForName ( "delay" ) != nil {
msg. isDelay = true
}
// 消息正文
if let body = message. elementForName ( "body" ) {
msg. body = body. stringValue ()
}
// 完整用户名
msg. from = message. from (). user + "@" + message. from (). domain
// 添加到消息代理中
xxdl ?. newMsg (msg)
}
}
// 收到状态
func xmppStream(sender: XMPPStream !, didReceivePresence presence: XMPPPresence !) {
// 我自己的用户名
let myUser = sender. myJID . user
// 好友的用户名
let user = presence. from (). user
// 用户所在的域
let domain = presence. from (). domain
// 状态类型
let pType = presence. type ()
// 如果状态不是自己的
if (user != myUser) {
// 状态保存的结构
var zt = Zhuangtai ()
// 保存了状态的完整用户名
zt. name = user + "@" + domain
// 上线
if pType == "available" {
zt. isOnline = true
ztdl ?. isOn (zt)
} else if pType == "unavailable" {
ztdl ?. isOff (zt)
}
}
}
//
连接成功
func xmppStreamDidConnect(sender: XMPPStream !) {
isOpen = true
do {
// 验证密码
try xs !. authenticateWithPassword ( pwd )
} catch _ {
}
}
// 验证成功
func xmppStreamDidAuthenticate(sender: XMPPStream !) {
// 上线
goOnline ()
func xmppStreamDidConnect(sender: XMPPStream !) {
isOpen = true
do {
// 验证密码
try xs !. authenticateWithPassword ( pwd )
} catch _ {
}
}
// 验证成功
func xmppStreamDidAuthenticate(sender: XMPPStream !) {
// 上线
goOnline ()
}
//使用时,在控制器中获取总代理,接管ztdl和xxdl,实现ztdl和xxdl代理协议
发送消息时,则需要构建xml信息
@IBAction
func
send(sender:
UIBarButtonItem
) {
// 获取聊天框文本
let msgStr = msgTF . text
// 如果文本不为空
if ( !msgStr!. isEmpty ) {
// 构建 XML 元素 message
var xmlmessage = DDXMLElement . elementWithName ( "message" ) as ! DDXMLElement
// 增加属性
xmlmessage. addAttributeWithName ( "type" , stringValue: "chat" )
xmlmessage. addAttributeWithName ( "to" , stringValue: toBuddyName )
xmlmessage. addAttributeWithName ( "from" , stringValue: NSUserDefaults . standardUserDefaults (). stringForKey ( "weixinID" ))
// 构建正文
var body = DDXMLElement . elementWithName ( "body" ) as ! DDXMLElement
body. setStringValue (msgStr)
// 消息的子节点中加入正文
xmlmessage. addChild (body)
// 通过通道发送 XML 文本
zdl (). xs !. sendElement (xmlmessage)
// 清空聊天框
msgTF . text = ""
// 保存自己的消息
// 获取聊天框文本
let msgStr = msgTF . text
// 如果文本不为空
if ( !msgStr!. isEmpty ) {
// 构建 XML 元素 message
var xmlmessage = DDXMLElement . elementWithName ( "message" ) as ! DDXMLElement
// 增加属性
xmlmessage. addAttributeWithName ( "type" , stringValue: "chat" )
xmlmessage. addAttributeWithName ( "to" , stringValue: toBuddyName )
xmlmessage. addAttributeWithName ( "from" , stringValue: NSUserDefaults . standardUserDefaults (). stringForKey ( "weixinID" ))
// 构建正文
var body = DDXMLElement . elementWithName ( "body" ) as ! DDXMLElement
body. setStringValue (msgStr)
// 消息的子节点中加入正文
xmlmessage. addChild (body)
// 通过通道发送 XML 文本
zdl (). xs !. sendElement (xmlmessage)
// 清空聊天框
msgTF . text = ""
// 保存自己的消息
var
msg =
WXMessage
()
msg.
isMe
=
true
msg. body = msgStr!
// 加入到聊天记录
msgList . append (msg)
// 通知表格刷新
self . tableView . reloadData ()
msg. body = msgStr!
// 加入到聊天记录
msgList . append (msg)
// 通知表格刷新
self . tableView . reloadData ()
}
注:感谢小波老师