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()
}
注:感谢小波老师
本文介绍了如何在Swift中使用XMPP进行即时通讯操作,包括建立连接、发送上线和下线状态、接收和发送消息、处理用户在线状态的改变。通过实现XMPPStreamDelegate代理协议,实现了接收消息和状态更新的功能。
1018

被折叠的 条评论
为什么被折叠?



