6. Swift 基于Xmpp和openfire实现一个简单的登录注册

1. 基本步骤:首先导入Xmpp框架,配置环境

-》由于我们使用的是OC的Xmpp框架,再进行Swift开发时需要进行桥接。 具体方法就是创建一个基于c的.h的头文件,然后将我们需要编译OC的语言的头文件包含这个.h文件中;

-》然后导入如下库文件,在头头文件选择路径中

如上图, 设置header Search paths 设置头文件的搜索路径,导入libxml2库文件相对路径,***注意前面是 usr 。以前第一次装的时候写成user找了半个多小时

-> 然后创建界面,随便弄两个框框和按钮自定义一个建议的界面。

应为在应用程序中用户名和密码可能被反复的使用,所以我们需要讲它门设置成一个单利类。

如下代码所示:

import UIKit

class WSBUserinfo: NSObject {

// 登录的用户名密码

var  userName : String?

var  userPasswd : String?

// 注册的用户名密码

var  userRegisterName : String?

var  userRegisterPasswd : String?

// 为了区分登录和注册

var  isLogin : Bool?

// 单例

class func getShareInstance() -> WSBUserinfo{

struct Singleton {

static var  dispatchOne : dispatch_once_t = 0

static var  instance : WSBUserinfo? = nil

}

dispatch_once(&Singleton.dispatchOne) { () -> Void in

Singleton.instance = WSBUserinfo()

}

return Singleton.instance!

}

}

//由于登录流程设计到了xmpp流协议实现,步骤较多。这里我们可以单独封装一个工具类。这样我们的登录和注册的主控制器就能得到极大的解脱:

在登录控制器中我们只需要将输入框的用户输入信息赋值到单利用户信息类 UserInfo里

然后调用 单利工具类的 usrLogin()方法及可自动完成所有的登录流程

再通过指定一个协议,实现对登录和注册状态的监听;

注册控制器的逻辑同上,这里就不重复了 。

注意点1:再每次连接请求时先把之前的连接断开,这样能避免一个账号长连接而其它的账号无法连接。

注意点2:再发送登录注册时中间都涉及到了共同的连接请求和连接状态请求,我们需要在单利类中建立一个Bool属性值做分支判定,这样我们只需要在方法内部做简单的调整,从而省去大量的代码步骤。

具体步骤请看下面代码

import UIKit

class WSBLoginViewController: UIViewController,WSBXMPPLoginDelegate {

@IBOutlet weak var userNameField: UITextField!

@IBOutlet weak var userPasswdField: UITextField!

@IBAction func loginBtnClick(sender: AnyObject) {

WSBUserinfo.getShareInstance().isLogin = true

print("用户名:\(userNameField.text!)")

print("密码是:\(userPasswdField.text!)")

// 把用户名 密码存入工具类 WSBUserinfo 这个单例对象中

WSBUserinfo.getShareInstance().userName = userNameField.text!

WSBUserinfo.getShareInstance().userPasswd = userPasswdField.text!

// 调用XMPP 工具类 完成登录

// 登录之前先给WSBXMPPTool设置代理

WSBXMPPTool.getSharedInstance().loginDelegate = self

WSBXMPPTool.getSharedInstance().userLogin()

}

/** 登录协议中的方法 */

func loginSuccess() {

print("登录成功")

// 切换到主界面

let  storyBoard  = UIStoryboard.init(name: "Main", bundle: nil)

UIApplication.sharedApplication().keyWindow?.rootViewController =

storyBoard.instantiateInitialViewController()

}

func loginFailed() {

print("登录失败")

}

func loginNetError() {

print("登录时网络错误")

}

override func viewDidLoad() {

super.viewDidLoad()

}

deinit{

print("deinit\(self)")

}

}

RegisterViewController:

import UIKit

class WSBRegisterViewController: UIViewController,WSBXMPPRegisterDelegate {

@IBOutlet weak var userRegiserName: UITextField!

@IBOutlet weak var userRegisterPasswd: UITextField!

@IBAction func registerBtnClick(sender: AnyObject) {

// 说明这是注册行为

WSBUserinfo.getShareInstance().isLogin = false

WSBUserinfo.getShareInstance().userRegisterName = self.userRegiserName.text!

WSBUserinfo.getShareInstance().userRegisterPasswd = self.userRegisterPasswd.text!

// 调用XMPPTool的 注册方法

WSBXMPPTool.getSharedInstance().registerDelegate = self

WSBXMPPTool.getSharedInstance().userRegister()

}

/** 实现注册协议中的方法 */

func registerSuccess() {

print("注册成功")

self.dismissViewControllerAnimated(true, completion: nil)

}

func registerFailed() {

print("注册失败")

}

func registerNetError() {

print("注册时网络错误")

}

}

登录和注册协议

import Foundation

// 登录协议

protocol WSBXMPPLoginDelegate : NSObjectProtocol {

// 登录成功

func  loginSuccess()

// 登录失败

func  loginFailed()

//  网络错误

func  loginNetError()

}

// 注册协议

protocol WSBXMPPRegisterDelegate : NSObjectProtocol {

// 注册成功

func  registerSuccess()

// 注册失败

func  registerFailed()

// 注册网络错误

func  registerNetError()

}

Swift:

import UIKit

/** 桥接文件 项目--buildSettings --> 搜索 Objective-c Bride 设置即可

这是一个XMPP的工具类 可以完成登录和注册的行

*/

class WSBXMPPTool: NSObject, XMPPStreamDelegate {

var  xmppStream : XMPPStream!

// 登录的Delegate

weak var loginDelegate : WSBXMPPLoginDelegate?

// 注册的Deletegate

weak var registerDelegate : WSBXMPPRegisterDelegate?

// 保证xmppStream 使用时非空

override init() {

super.init()

setupXmppStream()

}

class func  getSharedInstance() -> WSBXMPPTool {

struct Singleton {

static var predicate : dispatch_once_t = 0

static var instance : WSBXMPPTool? = nil

}

dispatch_once(&Singleton.predicate) { () -> Void in

Singleton.instance = WSBXMPPTool()

}

return  Singleton.instance!

}

// 设置流 设置代理

func setupXmppStream(){

xmppStream = XMPPStream()

xmppStream.addDelegate(self, delegateQueue: dispatch_get_main_queue())

}

// 连接服务器

func connectToHost(){

// 先断开上次的 不断开登录之后没法再登录

xmppStream.disconnect();

// 调用设置xmppStream

if self.xmppStream == nil {

self.setupXmppStream()

}

var userName : String? = nil

if WSBUserinfo.getShareInstance().isLogin! {

userName = WSBUserinfo.getShareInstance().userName

}else{

userName = WSBUserinfo.getShareInstance().userRegisterName

}

// 构建jid   设置hostName 和 port

xmppStream.myJID = XMPPJID.jidWithUser(userName, domain: XMPPDOMAIN, resource: "iphone")

xmppStream.hostName = XMPPHOSTNAME

xmppStream.hostPort = XMPPPORT

do {

try xmppStream.connectWithTimeout(XMPPStreamTimeoutNone)

}catch let error as NSError{

print(error.description)

}

}

// 连接成功(代理方法)

func xmppStreamDidConnect(sender: XMPPStream!) {

// 调用发送密码 请求授权

if WSBUserinfo.getShareInstance().isLogin!{

self.sendLoginPasswd()

}else{

// 使用密码注册

self.sendRegisterPasswd()

}

}

// 发送密码 注册

func sendRegisterPasswd(){

do{

try xmppStream.registerWithPassword(WSBUserinfo.getShareInstance().userRegisterPasswd)

}catch let error as NSError{

print(error.description)

}

}

// 发送密码 请求授权

func sendLoginPasswd(){

do{

try xmppStream.authenticateWithPassword(WSBUserinfo.getShareInstance().userPasswd)

}catch let error as NSError{

print(error.description)

}

}

// 授权成功(代理方法)

func xmppStreamDidAuthenticate(sender: XMPPStream!) {

print("授权成功")

// 发送在线消息

self.sendOnLine()

// 调用代理的登录成功的方法

loginDelegate?.loginSuccess()

}

// 发送在线消息

func sendOnLine(){

xmppStream.sendElement(XMPPPresence())

}

// 授权失败

func xmppStream(sender: XMPPStream!, didNotAuthenticate error: DDXMLElement!) {

print(error.description)

// 授权失败 调用代理的登录失败的方法

loginDelegate?.loginFailed()

}

// 连接断开(代理方法)

func xmppStreamDidDisconnect(sender: XMPPStream!, withError error: NSError!) {

// 如果网络有问题断开 则error 中有值

// 如果是主动断开  则error是 nil

if error != nil {

if WSBUserinfo.getShareInstance().isLogin!{

//登录网络有问题 调用代理的网络错误

loginDelegate?.loginNetError()

}else{

// 注册时网络有问题

registerDelegate?.registerNetError()

}

}

}

//注册成功 (代理方法 )

func  xmppStreamDidRegister(sender: XMPPStream!) {

// 调用代理的注册成功

registerDelegate?.registerSuccess()

}

// 注册失败 (代理方法 )

func xmppStream(sender: XMPPStream!, didNotRegister error: DDXMLElement!) {

registerDelegate?.registerFailed()

}

// 用户完成登录的方法

func  userLogin(){

self.connectToHost()

}

// 用户完成注册的方法

func  userRegister(){

self.connectToHost()

}

}

时间: 2024-08-25 20:33:51

6. Swift 基于Xmpp和openfire实现一个简单的登录注册的相关文章

go语言实现一个简单的登录注册web小程序

最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣.根据<go web编程>中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜: 这个例子使用到了beego框架和beedb框架,如果是go新手beego和beedb得自己去google下载安装. 目录结构: index.go package controllers import ( "fmt" "github.com/astaxie/beego"

Android 基于XMPP Smack openfire 开发的聊天室

Android基于XMPP Smack openfire 开发的聊天室

对基于Servlet+JSP+JavaBean开发模式的用户登录注册的升级

还记得我前面所写的博文基于Servlet+JSP+JavaBean开发模式的用户登录注册吗?我们以前是创建代表数据库的xml文件来保存用户信息的,现在我们已经学习了数据库相关的知识,所以应把xml换成数据库,升级成数据库应用. 我们在把以前的工程复制并拷贝时,假设以前的工程名是day09_user,现复制一份并拷贝,重新修改工程名为day14_user,此刻将其直接部署在tomcat服务器上,那么day14_user这个JavaWeb应用映射的虚拟目录仍然是"/day09_user",

基于Servlet+JSP+JavaBean开发模式的用户登录注册

基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式. 这里以一个最常用的用户登录注册程序来讲解Servlet+JSP+JavaBean开发模

基于Spring aop写的一个简单的耗时监控

前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些对方法,模块耗时的监控,为了方便性能的监控,问题的定位等.如果每一个方法里都加上 ... Stopwatch watch = Stopwatch.createStarted(); ... watch.elapsed(TimeUnit.MILLISECONDS) ... 类似的代码肯定没问题,但是就会

基于gin框架搭建的一个简单的web服务

刚把go编程基础知识学习完了,学习的时间很短,可能还有的没有完全吸收.不过还是在项目中发现知识,然后在去回顾已学的知识,现在利用gin这个web框架做一个简单的CRUD操作. 1.Go Web框架的技术选型 Top 6 web frameworks for Go as of 2017,可以看看这个go语言中Web框架的对比和老大的推荐,我选择gin框架作为学习go语言的框架. image.png 2.Gin介绍 gin框架的中文文档,这个文档相当好,清晰明了解释gin框架的整个用法.下面是gin

javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式. 这里以一个最常用的用户登录注册程序来讲解Servlet+JSP+JavaBean开发模式,通过这个用户登录注册程序综合案例,把之前的学过的XML.Xpat

使用struts做一个简单的登录跳转

[java web]第一节课 3.7号作业 做一个非常简单的登录跳转界面,要求: 需要一个登陆界面用于接受用户输入的信息 输入姓名"wei"如果正确则跳转到"index.jsp"页面显示"welcome" 如果输入的姓名不是"wei"则跳转到"login.jsp"页面重新输入. 1.创建一个web project命名为"Login1"版本用JavaEE 5 version:1.7 2.右

javaweb学习总结——基于Servlet+JSP+JavaBean开发模式的用户登录注册

一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式. 这里以一个最常用的用户登录注册程序来讲解Servlet+JSP+JavaBean开发模式,通过这个用户登录注册程序综合案例,把之前的学过的XML.Xpat