iOS开发-即时通信XMPP

XMPP实现简单的登录注册功能 XMPPFramework框架是通过代理的方式实现消息传递的,所以要实现注册登录功能,先理解一些基本的连接过程: 1.运行后需要和服务器建立一个长连接,系统会反馈连接是否成功 2.成功时需要告诉服务器的用户的密码,服务器判断是否给予授权 3.成功授权后,告诉服务器上线了。 4.将要离开时告诉服务器,我需要断开链接了。 5.服务器反馈你可以断开了,然后你再告诉服务器你下 阅读详情


1. 即时通信

 1> 概述

  即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能。

  即时通讯有多种实现方式,例如:XMPP、环信、融云等。

 2> XMPP(可扩展消息处理现场协议) 

  XMPP(XML Messages Presence Protocol(可扩展消息处理现场协议))是基于可扩展标记语言(XML)的协议,可用于即时通信(IM)。

 3> XMPP的优点

  • 开放

  XMPP协议是由JSF开源社区组织开发的,不属于任何的机构和个人,从根本上保证了其开放性。

  • 标准

  互联网工程工作组将XMPP于2002年正式列为认可的实时通讯及Presence技术。

  • 分布式的网络架构

  XMPP 协议虽然是基于Client/Server 架构,但是XMPP协议本身并没有这样的限制。网络的架构和电子邮件十分相似,但没有结合任何特定的网络架构,适用范围非常广泛。

  • XMPP 协议具有良好的扩展性

  基于XML 建立起来的应用具有良好的语义完整性和扩展性。

  • XMPP 具有很好的弹性

  XMPP 除了可用在即时通信的应用程序,还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等。

  • 安全性

  XMPP在Client-to-Server通信和Server-to-Server通信中都使用TLS (Transport Layer Security)协议作为通信通道的加密方法,保证通信的安全。

  XMPP环境的搭建的步骤详见XMPP环境的搭建

2. 工程中添加XMPP

  将XMPP协议第三方文件拖入工程,下载地址:https://github.com/AlonerOwl/XMPPFramework

3. 登录、注册

 1> 界面搭建

  界面采用Storyboard,效果图如下:

 2> 初始化XMPP通道

        //初始化通道
        self.xmppStream = [[XMPPStream alloc] init];
        //openfire服务器IP地址
        self.xmppStream.hostName = kHostName;
        //openfire服务器端口 默认5222
        self.xmppStream.hostPort = kHostPort;
        //添加代理
        [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()
         ];

 3> 连接服务器代码所需方法

 4> 登录代码所需方法

 5> 注册代码所需方法

 

 6> 全部代码(方法的使用详见代码注释)

  • 封装的XMPP控制器代码:

   XMPPManager.h

#import <Foundation/Foundation.h>

#import "XMPPFramework.h"

@interface XMPPManager : NSObject

/// 声明XMPP通道属性
@property (nonatomic, strong) XMPPStream *xmppStream;

+ (XMPPManager *)shareXMPPManager;

// 登录方法
- (void)loginWithUsername:(NSString *)username
                 password:(NSString *)password;
// 注册方法
- (void)registerWithUsername:(NSString *)username
                    password:(NSString *)password;

@end

  XMPPManager.m

#import "XMPPManager.h"

static XMPPManager *xmppManager = nil;

// 枚举记录状态
typedef NS_ENUM(NSUInteger, ConnectToServerPurpose) {
    ConnectToServerPurposeLogin,
    ConnectToServerPurposeRegister
};

// 遵循协议
@interface XMPPManager () <XMPPStreamDelegate>

/// 用户名
@property (nonatomic, copy) NSString *username;

/// 密码
@property (nonatomic, copy) NSString *password;

/// 记录当前的状态,判断是登录还是注册
@property (nonatomic) ConnectToServerPurpose connectToServer;

@end

@implementation XMPPManager

+ (XMPPManager *)shareXMPPManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        xmppManager = [XMPPManager new];
    });
    return xmppManager;
}

#pragma mark - 1.创建通道
- (instancetype)init
{
    self = [super init];
    if (self) {
        //初始化对象
        self.xmppStream = [XMPPStream new];
        
        // 设置服务器
        [self settingUpServer];
    }
    return self;
}

// 设置服务器
- (void)settingUpServer
{
    // 设置opfire服务器
    self.xmppStream.hostName = kHostName;
    // 设置服务器端口号
    self.xmppStream.hostPort = kHostPort;
    // 添加代理
    [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}

#pragma mark - 登录的方法
- (void)loginWithUsername:(NSString *)username
                 password:(NSString *)password
{
    self.username = username;
    self.password = password;
    
    // 记录登录状态
    self.connectToServer = ConnectToServerPurposeLogin;
    
    // 连接服务器
    [self linkServer];
}

#pragma mark - 注册的方法
- (void)registerWithUsername:(NSString *)username
                    password:(NSString *)password
{
    self.username = username;
    self.password = password;

    // 记录注册状态
    self.connectToServer = ConnectToServerPurposeRegister;
    
    // 连接服务器
    [self linkServer];
}

#pragma mark - 连接服务器
- (void)linkServer
{
    // 要连接服务器,要有用户身份认证
    // 身份证
    // 参数1:用户名
    // 参数2:域名
    // 参数3:资源
    XMPPJID *jid = [XMPPJID jidWithUser:self.username domain:kDomin resource:kResource];
    
    self.xmppStream.myJID = jid;
    
    // 如果当前聊天工具处于连接状态或已经连接,此时,你需要去切断连接【此逻辑不唯一】
    if ([self.xmppStream isConnected] || [self.xmppStream isConnecting]) {
        // 断开连接
        [self disConnectToServer];
    }
    
    // 设置连接超时
    NSError *error = nil;
    [self.xmppStream connectWithTimeout:30 error:&error];
    if (error) {
        NSLog(@"连接超时");
    }
    
}

#pragma mark - 断开连接(自己写的)
- (void)disConnectToServer
{
    // 当前用户不可用(下线了)
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
    // 告诉通道用户不可用(下线了)
    [self.xmppStream sendElement:presence];
    // 使用通道失去连接
    [self.xmppStream disconnect];
}

#pragma mark - XMPPStreamDelegate协议方法

#pragma mark 连接超时
- (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender
{
    NSLog(@"连接超时");
}

#pragma mark 连接成功
- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
    NSLog(@"连接成功");
    
    // 认证密码
//    [self.xmppStream authenticateWithPassword:self.password error:nil];
    
    // 区分登录和注册进行密码验证
    switch (self.connectToServer) {
        case ConnectToServerPurposeLogin:
            // 登录认证
            [self.xmppStream authenticateWithPassword:self.password error:nil];
            break;
            
        case ConnectToServerPurposeRegister:
            // 注册的认证
            [self.xmppStream registerWithPassword:self.password error:nil];
            break;
            
        default:
            break;
    }
}

#pragma mark 断开连接
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
{
    // 1. 自己动手断开
    // 2. 被动断开
    if (error) {
        NSLog(@"断开连接,error == %@", error);
    }
}

#pragma mark 认证失败
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
    NSLog(@"认证失败:error = %@", error);
}

#pragma mark 认证成功
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    // 当前用户可用(上线了)
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
    // 告诉通道用户可用(上线了)
    [self.xmppStream sendElement:presence];
    
    NSLog(@"认证成功");
}

@end
  • 登录界面

  LoginViewController.m

#import "LoginViewController.h"

#import "XMPPManager.h"

@interface LoginViewController ()

/// 用户输入框
@property (weak, nonatomic) IBOutlet UITextField *usernameTextField;

/// 密码输入框
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;

@end

@implementation LoginViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)loginAction:(UIButton *)sender
{
    [[XMPPManager shareXMPPManager] loginWithUsername:self.usernameTextField.text password:self.passwordTextField.text];
}

@end
  • 注册界面

   RegisterViewController.m

#import "RegisterViewController.h"

#import "XMPPManager.h"

@interface RegisterViewController () <XMPPStreamDelegate>

@property (weak, nonatomic) IBOutlet UITextField *registerUNTextField;
@property (weak, nonatomic) IBOutlet UITextField *registerPWTextField;

@end

@implementation RegisterViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    // 添加代理
    [[XMPPManager shareXMPPManager].xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// 按钮点击事件
- (IBAction)registerAction:(id)sender
{
    [[XMPPManager shareXMPPManager] registerWithUsername:self.registerUNTextField.text password:self.registerPWTextField.text];
}

#pragma mark - XMPPStreamDelegate实现协议方法
// 注册成功后,dismiss到登录界面
- (void)xmppStreamDidRegister:(XMPPStream *)sender
{
    NSLog(@"注册成功");
    [self dismissViewControllerAnimated:YES completion:nil];
}

// 注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
{
    NSLog(@"注册失败:%@", error);
}

@end

基于XMPP的iOS聊天功能完整实现方案 说了这么多,你可能会问:现在都2025年了,为啥还要搞XMPP?不是有WebSocket + JSON + 自定义协议更简单吗?答案是:简单≠可靠,灵活≠持久。XMPP的优势在于:标准化程度极高:RFC规范严谨,互操作性强去中心化架构:支持联邦通信,打破信息孤岛长期演进能力:XEP机制保障协议可持续发展安全模型成熟:TLS + SASL + OMEMO端到端加密全套可选。 阅读详情

相关推荐

Kali使用Metasploit内、外网渗透windows系统

Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具。当H.D. Moore在2003年发布Metasploit时,计算机安全状况也被永久性地改变了。 一、(内网渗透)内网英文缩写WAN;内网又称局域网 局域网的覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局域网可以实现文件管理、应用软件共享、打印机共享等功能,在使用过程当中,通过维护局域网网...

QQ670663的博客 2万+

IOS -- xmppStreamDidDisconnect: Error Domain=GCDAsyncSocketErrorDomain Code=7 解决方案

在使用XMPPFramework 的时候,每次发送消息调用 [xmppStream sendElement:aMessage]; 就会调用xmppStreamDidDisconnect 这个代理。报错如下: xmppStreamDidDisconnect: Error Domain=GCDAsyncSocketErrorDomain Code=7 "Socket closed by r

Gmonday 一个帅哥的专栏 10000

从量子兔AlphaPi硬件拆解到ESP32-C3库开发实战

本文详细拆解了量子兔AlphaPi开发板的硬件构成,重点分析了其核心ESP32-C3芯片及外围传感器。通过逆向工程揭示了GPIO引脚定义与通信协议,并实战演示了如何从零开发MicroPython库,驱动按键、加速度计及LED点阵,最终整合成一个互动平衡球游戏项目,展现了开源硬件在教育与二次开发中的潜力。

weixin_29164497的博客 458

xmpp错误日志集锦

xmppStreamDidDisconnect: Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused" UserInfo=0x16d5b5a0 {NSLocalizedFailureReason=Error in connect() function, NSLocalizedDescription=Connection ref

SoulHao的专栏 3946

ARKit面部动画实战:如何用blend shape让数字人表情更自然(附中文对照表)

本文深入探讨了如何利用ARKit的blend shape技术驱动数字人面部动画,以实现更自然生动的表情。文章提供了详细的blend shape中文对照表,并分享了实战技巧,包括构建复合表情动画序列、处理不对称性与微表情,以及性能优化策略,旨在帮助开发者高效提升数字人的表情表现力。

weixin_29292535的博客 324

【Docker】Ubuntu安装Docker

1 安装Docker 安装Docker有三种方法,这里只用repository安装,更详细的安装方法可以看官方文档。 1.1 添加repository 首先更新apt: sudo apt-get update 安装一些包让apt可以通过https使用repository: sudo apt-get install \ apt-transport-https \ ca-certif...

widiot的博客 9946

openfire+XMPP实现即时通讯

文章背景 大部分的APP都是盈利为目的而开发,与消费者互动必成重要的一个功能,有互动就有潜在客户,而且大多数老板都认为自己的APP没有IM功能就会觉得不上档次。目前市面的比较好点的即时通讯第三方有环信、融云等。我不采用第三方的原因主要三点:1、第三方前期免费开放,有可能在圈用户,不排除后期收费;2、其实第三方服务器经常蛋机,总有正在维护升级,请耐心等待啥啥的,总感觉受之于人;3、第三方sdk服务器

XiNanHeiShao的专栏 1万+

Spec Kit:GitHub 官方推出的规范驱动开发工具包,让 AI 编程真正可控、高效、高质量

先明确“做什么”和“为什么”,再考虑“如何做”。它通过一系列标准化命令(如/specify/plan/implement可验证的功能规格(spec)可执行的技术方案(plan)可追溯的开发任务(tasks)高质量的实现代码(code)最终实现“规范即代码,代码即规范”的闭环。📌项目地址许可证:MIT(完全开源,欢迎贡献)Spec Kit 代表了 GitHub 对AI 原生开发(AI-Native Development)AI 不应替代开发者,而应放大开发者的意图。

lpfasd123的博客 1711

RK3576 Buildroot 双机 ADB 异常排障实录:同版 `boot.img`,一台可识别一台不可识别

进程在跑”不等于“USB 枚举成功”,adbd存活只是必要不充分条件。生产环境中的全局别名可能反向污染系统脚本。shell 命令替换中的字符串问题,必须做字节级验证(od -tx1相比“改环境规避”,核心脚本对输入做鲁棒处理更可长期维护。

小灰灰的博客 209

基于深度学习的交通标志识别系统:使用YOLOv10、UI界面及自定义数据集的实现

实时检测和分类交通标志。提供一个友好的用户界面,方便用户上传图片或视频进行检测。收集和显示检测结果,以便进行进一步分析。YOLO(You Only Look Once)是一种高效的目标检测算法,它能够在一次前向传播中同时进行目标定位和分类。YOLOv10是YOLO系列的最新版本,具有更好的检测精度和速度。本项目成功实现了基于YOLOv10的交通标志检测与识别系统。通过实时检测与分类,系统能够有效识别出各种交通标志,为智能交通应用提供支持。

YOLO 1234

移动即时通信系统推送服务器,基于WebSocket的移动即时通信系统

摘要:即时通信以互联网为基础,用户通过网络发送和接收文本、声音、图像、视频等多媒体信息,在线进行实时的交流和互动。这种方便快捷的通信方式深受用户喜爱。传统的即时通信应用大部分在PC上实现。近年来,随着移动通讯技术的发展和智能移动终端的普及,智能移动设备正成为人们接入互联网的主要方式,因此出现了将即时通信技术应用于移动互联网业务的新需求,并具有广阔的前景。本文以实际的应用项目为背景,对移动即时通信及...

weixin_31304817的博客 441

Python 爬虫实战:豆瓣 / IMDB 电影数据抓取(评分 + 剧情 + 演员阵容结构化处理)

在数据为王的时代,电影数据是进行市场分析、推荐系统构建和学术研究的重要资源。豆瓣和 IMDB 作为国内外最具影响力的电影评分和资讯网站,包含了海量高质量的电影数据。本文将带领你从零开始,构建一个健壮的 Python 爬虫,用于抓取豆瓣和 IMDB 的电影信息,并将其中的非结构化数据(如剧情简介、演员列表)进行清洗和结构化处理,最终存储到便于分析的结构化文件(如 CSV)中。

yansideyucsdn的博客 953

iOS之即时通信 XMPP

如今, 即时通信,支付,是相当火的的软件.而 XMPP 第三方即时通信,是最基础的的技术, 如果你有很高的技术, 你完全可以对其进行封装,就比如才没几年的环信即时通信.他就是继承于 XMPP 来写的. 下面,我来和你说说如何将其添加到你的项目中, 做出相当棒的 即时通信App , // 导入第三方 XMPP,导入头文件 XMPPFrame.h 之后. 1. 首先在助手类中写 XmppStream

qq_32780047的博客 578

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

比较好用的第三方推荐

(1)AFNetworking 目前比较好用的第三方,默认网络请求是异步,通过block回调的方式对返回的数据处理。 注意事项:AFNetworking对服务器返回的ContentType要求比较严格,默认只支持application/json的返回。需要添加对text/html返回的支持,否则可能无法返回数据 上传文件,推荐使用用第二种: [formData appendP...

aoshou6246的博客 126

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

iOS开发 ☞ 五分钟集成环信,你逗我?

说起第三方框架,笔者最先接触的是高德地图,那个时候几乎用遍了SDK的所有方法,浏览过论坛里数万条解答,最终还是不能解决一些问题(仅吐槽,不知道现在的版本怎么样)最近在搞即时通信这个模块,随意的百度下,各种”跟我学习五分钟集成环信”的帖子,亲,你直接拿着Demo上吗?确实,这是一个很有意思的模块,Socket实现长链接,如果使用谷歌公司封装的TCPSocket,那么我们可以选择自己定义或者使用现有的X

Magic-ZYJ的博客 645

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

iOS开发之使用XMPPFramework实现即时通信(一)

iOS开发之使用XMPPFramework实现即时通信(一) 关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让我们的微信可以实现互联通信。要做的准备工作是要有服务器支持XMPP协议,然后通过spark注册个测试账号,最后就可以通过XMPP用我们已有的账号和密码进行通信啦。至于如何使服务器支持XMPP协议,...

u010154380的专栏 237

XMPP添加删除好友

  在现阶段的通信服务中。各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互通。有了这个协议之后,使用不论什么一个组织或者个人提供的即使通信服务,都可以无障碍的与其它的及时通信服务的用户进行交流。比如google 公司2005年推出的Google talk就是一...

weixin_34072637的博客 249

XMPP在iOS中的应用

先这样。

勿在浮沙筑高楼 593

XMPP增加删除好友

  在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互通。有了这个协议之后,使用任何一个组织或者个人提供的即使通信服务,都能够无障碍的与其他的及时通信服务的用户进行交流。例如google 公司2005年推出的Google talk就是一款基于XMPP...

weixin_34407348的博客 142

01环信iOS SDK的集成

零.什么是环信? 环信是一个第三平台,提供即时通信(IM –Instant Messaging )的服务 环信是在XMPP的基础上进行二次开发 环信在网络上传输的数据也是XML 使用环信,不用自己搭建服务器,节约成本 环信日活30万以下,永远免费 公司如要开发即时通讯软件,建议首选环信,环信占用市场份额较大 一.集成环信的前提准备 注册成为环信开发者 http

925

仿ios版微信应用源码

仿微信基本功能。基于XMPP服务器的即时通信以及交友客户端。 ----第一期代码的功能如下---- 1.新用户注册 2.登陆并连接XMPP服务器 握手 保持在线 2.查找最新注册用户:(下拉刷新 上拉翻页,做的比较匆忙,没操作提示) 3.点击某个用户即可对他发送消息(聊天记录下一期更新) 4.首页显示收到的和发送的所有消息(排序...

weixin_34384557的博客 123

iOS客户端实现 XMPP协议的步骤

iOS客户端实现XMPP协议的步骤 在Xcode开发工具中新建iOS工程XMPPSample 将第三方开源框架XMPPFramework添加到工程内 配置XMPPFramework框架需要的两个底层动态库 libresolv.dylib libxml2.dylib Header Search Paths中添加引用库”/usr/include/libxml2” 迷尘  14:19:45

筑雅浅缃的专栏 557

XMPP个人信息展示

  在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互通。有了这个协议之后,使用任何一个组织或者个人提供的即使通信服务,都能够无障碍的与其他的及时通信服务的用户进行交流。例如google 公司2005年推出的Google talk就是一款基于XMPP...

weixin_33894992的博客 66
上一篇: 关于安装wordpress出现500 Internal Server Error的解决方案
下一篇: iOS开发UIKit框架-可视化编程-XIB
Kryptons
博客等级 码龄10年 2粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值