最近看到很多人在琢磨ios即时通讯这块,于是出去好奇,决定动手试试,今天就先从xmpp这个框架来尝试。
其实xmpp也就一个协议而已,更多人还是喜欢把它叫做Jabber
首先还是提供一下下载地址:
服务端Jabber,这里我用openfire来搭建:http://www.igniterealtime.org/
这里推荐一篇openfire配置的博文:http://www.cnblogs.com/xiaodao/archive/2013/04/05/3000554.html
客户端就是ios的xmppFrame一些库咯,给个github方便:https://github.com/robbiehanson/XMPPFramework
xmppFrame里面有demo,在xcode文件下
第三方类库,第一步还是惯例地导入需要的库文件
懒人喜欢直接上代码,出来吧,代码君!
- - (void)setupStream
- {
- NSAssert(xmppStream == nil, @"Method setupStream invoked multiple times");
- // 初始化XmppStream
- xmppStream = [[XMPPStream alloc] init];
- #if !TARGET_IPHONE_SIMULATOR
- {
- // 想要xampp在后台也能运行?
- //
- // P.S. - 虚拟机不支持后台
- xmppStream.enableBackgroundingOnSocket = YES;
- }
- #endif
- // 初始化 reconnect
- //
- // 这东西可以帮你把意外断开的状态连接回去...具体看它的头文件定义
- xmppReconnect = [[XMPPReconnect alloc] init];
- // 初始化 roster
- xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
- // xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] initWithInMemoryStore];
- xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterStorage];
- xmppRoster.autoFetchRoster = YES;
- xmppRoster.autoAcceptKnownPresenceSubscriptionRequests = YES;
- // 初始化 vCard support
- xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
- xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage];
- xmppvCardAvatarModule = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:xmppvCardTempModule];
- // 初始化 capabilities
- xmppCapabilitiesStorage = [XMPPCapabilitiesCoreDataStorage sharedInstance];
- xmppCapabilities = [[XMPPCapabilities alloc] initWithCapabilitiesStorage:xmppCapabilitiesStorage];
- xmppCapabilities.autoFetchHashedCapabilities = YES;
- xmppCapabilities.autoFetchNonHashedCapabilities = NO;
- // 激活xmpp的模块
- [xmppReconnect activate:xmppStream];
- [xmppRoster activate:xmppStream];
- [xmppvCardTempModule activate:xmppStream];
- [xmppvCardAvatarModule activate:xmppStream];
- [xmppCapabilities activate:xmppStream];
- // 我们可以加添加委托来获取我们感兴趣的东西
- [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
- [xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
- // 下面可以替换成自己的域名和端口
- // 如果你没有提供一个地址,JID也是一样可以代替的,JID的格式类似这样"用户名@域名/roster",框架会自动抓取域名作为你的地址
- // 如果没有设置特殊的端口,默认为5222
- [xmppStream setHostName:@"xxxxx"];
- [xmppStream setHostPort:5222];
- //下面这两个根据你自己配置需要来设置
- allowSelfSignedCertificates = NO;
- allowSSLHostNameMismatch = NO;
- }
好了,具体要前期设置的东西都在上面,接下来就是连接上我们的服务器了
- - (BOOL)connect
- {
- if (![xmppStream isDisconnected]) {
- return YES;
- }
- <span style="white-space:pre"> </span>//这里前提你需要提供一个交互界面,可以填写jid和password的,然后把它们的值保存到NSUserDefaults
- NSString *myJID = [[NSUserDefaults standardUserDefaults] stringForKey:kXMPPmyJID];
- NSString *myPassword = [[NSUserDefaults standardUserDefaults] stringForKey:kXMPPmyPassword];
- if (myJID == nil || myPassword == nil) {
- return NO;
- }
- [xmppStream setMyJID:[XMPPJID jidWithString:myJID]];
- password = myPassword;
- NSError *error = nil;
- if (![xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error])
- {
- UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error connecting"
- message:@"See console for error details."
- delegate:nil
- cancelButtonTitle:@"Ok"
- otherButtonTitles:nil];
- [alertView show];
- DDLogError(@"Error connecting: %@", error);
- return NO;
- }
- return YES;
- }
如果一切顺利的话,执行下面的方法
- - (void)xmppStreamDidConnect:(XMPPStream *)sender
- {
- DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
- isXmppConnected = YES;
- NSError *error = nil;
- if (![[self xmppStream] authenticateWithPassword:password error:&error])
- {
- DDLogError(@"Error authenticating: %@", error);
- }
- }
- - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
- {
- DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
- [self goOnline];
- }
- - (void)goOnline
- {
- XMPPPresence *presence = [XMPPPresence presence]; // type="available" is implicit
- [[self xmppStream] sendElement:presence];
- }
如果不成功会调用
- - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error
- {
- DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
- }
这种情况JID写错了,或者密码错了,好好检查一下
发个成功后的界面,普天同庆一下!
试试从服务端发一条信息给所有客户端
相关推荐
白色简洁风格的学术交流会议源码下载.zip
内容概要:本文提出了利用交变电流场测量(ACFM)技术对水下结构中的缺陷进行可视化和智能识别的方法。通过对缺陷引起畸变磁场的分析,开发了梯度成像算法作为图像预处理方法,突显了缺陷的视觉形态。实验验证了梯度成像算法的有效性,并利用卷积神经网络(CNN)深度学习算法识别预处理后的灰度图样本。实验结果显示,电流扰动理论澄清了特征信号与缺陷形态之间的关系,单裂纹、不规则裂纹和腐蚀等缺陷可以被智能识别和准确评估。 适合人群:从事水下结构检测的研究人员和技术人员,以及对非破坏性检测技术感兴趣的工程领域人士。 使用场景及目标:① 海洋钻井平台、管道、海底油气处理设施等水下结构的缺陷检测;② 利用交变电流场测量技术和图像处理技术提高缺陷识别的准确性和智能化程度。 其他说明:本文不仅提出了交变电流场测量技术的新方法,还通过实验证明了这些方法的有效性,为实际应用提供了技术支持。
Neck Deep - In Bloom [mqms2].mgg2.flac
基于ESO的永磁同步电机无感FOC 1.采用线性扩张状态观测器(LESO)估计电机反电势,利用锁相环从反电势中提取位置和转速信息,从而实现无位置传感器控制; 2.提供算法对应的参考文献和仿真模型。 购买赠送PMSM控制相关电子资料。 仿真模型纯手工搭建,不是从网络上复制得到。 仿真模型仅供学习参考。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
三相逆变 单相 三相逆变器 SPWM ---stm32主控(输入、输出具体可根据需要设定),本逆变器可以二次开发。 本内容只包括 逆变程序,实现变频(0~100Hz)、变压调节,均有外接按键控制(使用C语言实现)。
NSConditionException如何解决.md
白色简洁风格的房产交易中心企业网站源码下载.zip
水果分拣机15可编辑全套技术资料100%好用.zip
内容概要:本文为《1+X移动互联网应用开发初级》课程的期中考试试卷解析。解析涵盖了Java开发入门基础知识,主要包括Android中SQLite数据库操作、ContentProvider使用、BroadcastReceiver、Intent传递数据、Activity生命周期、Service生命周期管理、文件操作模式、通知管理、JSON和XML解析、权限管理等内容。通过对各个题目的解析,帮助学生更好地理解和掌握移动互联网应用开发的基础知识和技术。 适合人群:正在学习《1+X移动互联网应用开发初级》课程的学生,尤其是网络21班的学生。 使用场景及目标:①帮助学生理解和掌握Android开发的基础知识点;②提高学生的实际操作能力,尤其是在期中考试后的查漏补缺。 阅读建议:建议学生在阅读解析时,结合教材和实践操作,加深对各知识点的理解。同时,可以通过模拟题进行练习,巩固学习成果。
自动送料切割机sw可编辑全套技术资料100%好用.zip
ClosedChannelException(解决方案).md
长焊缝打磨机step全套技术资料100%好用.zip
从给定的文件信息来看,核心知识点聚焦于内部审计业务的实施,特别是内部审计师如何遵循规范、标准和最佳实践来进行审计工作。以下是对关键知识点的深入解析: ### 内部审计业务实施的关键要素 #### 理解内部审计业务全过程 内部审计业务覆盖了从计划、实施、报告到后续跟踪的全过程,要求内部审计师具备全面的专业技能和严谨的工作态度。这一过程旨在确保组织的风险管理、控制和治理机制的有效性。 #### 核心业务类型 内部审计主要包括确认和咨询两大业务类型。确认服务侧重于评估组织的控制和风险管理程序,而咨询服务则更注重提供改进和优化现有流程的建议。 ### 实施内部审计的依据与标准 #### IIA职业实务框架 - **标准与道德规范**:包括内部审计实务标准和职业道德规范,前者指导内部审计活动的执行,后者强调审计师的公正、客观、保密和胜任能力。 - **实务公告**:提供非强制性的指导,涉及内部审计的特定操作流程和程序。 - **发展与实务帮助**:涵盖各种专业资源,如研究资料、书籍和培训课程,为审计人员提供深入的学习和支持。 #### 法律、法规和其他标准 除了IIA框架外,内部审计还应考虑适用
IncompatibleClassChangeError(解决方案).md
html渲染器,粘贴html代码到这个渲染器即可渲染出对应的效果
白色简洁风格的时尚宝马老爷车企业网站模板下载.zip
白色宽屏风格的贸易商务企业网站模板.zip
白色宽屏风格的旅游路线推荐整站网站源码下载.zip
白色简洁风格的社交博客网站后台系统源码下载.zip
实惠 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calculater extends JFrame implements ActionListener。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。