Swift中XMPP的简单使用

本文介绍了如何在Swift中使用XMPP进行即时通讯操作,包括建立连接、发送上线和下线状态、接收和发送消息、处理用户在线状态的改变。通过实现XMPPStreamDelegate代理协议,实现了接收消息和状态更新的功能。
var xs : XMPPStream?
建立通道:
func buildStream(){
     xs = XMPPStream()
     xs?.addDelegate(self,delegateQueue:  dispatch_get_main_queue())
}
发送上线状态
    func goOnline() {
       
let p = XMPPPresence()
       
       
xs!.sendElement(p)
    }
   
发送下线状态
    func goOffline() {
       
let p = XMPPPresence(type: "unavailabe")
       
       
xs!.sendElement(p)
    }
连接服务器(查看服务器是否可连接)
    func connect() -> Bool {
       
//建立通道
        buildStream()
        //通道已经连接
        if xs!.isConnected() {
           
return true
        }
        //取系统中保存的用户名/密码/服务器地址
        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 _ {
            }
       
        }

断开连接
   func disConnect() {
        if xs != nil {
           
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 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 = ""
           
           
//保存自己的消息
            var msg = WXMessage()
            msg.isMe = true
            msg.
body = msgStr!
           
           
//加入到聊天记录
            msgList.append(msg)
           
           
//通知表格刷新
            self.tableView.reloadData()
           
        }
注:感谢小波老师
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值