Swift中XMPP的简单使用

本文介绍了如何在Swift中使用XMPP进行即时通讯操作,包括建立连接、发送上线和下线状态、接收和发送消息、处理用户在线状态的改变。通过实现XMPPStreamDelegate代理协议,实现了接收消息和状态更新的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、付费专栏及课程。

余额充值