【原】iOS学习43即时通信之XMPP(2)
本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1)
1. 好友列表
1> 初始化好友花名册
// 获取管理好友的单例对象
XMPPRosterCoreDataStorage *rosterStorage = [XMPPRosterCoreDataStorage sharedInstance];
// 给roster属性进行初始化
self.xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:rosterStorage dispatchQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, )];
// 将好友列表在通道中激活
[self.xmppRoster activate:self.xmppStream];
// 设置花名册代理
[self.xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
2> XMPPRoster代理方法
代码:
#pragma mark - XMPPRosterDelegate代理方法
/// 开始获取好友
- (void)xmppRosterDidBeginPopulating:(XMPPRoster *)sender
{
NSLog(@"开始获取好友");
} /// 结束获取好友
- (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender
{
// 当前页面适用于显示好友列表的,所以在结束好友获取的代理方法中要进行刷新页面,然后将数据显示
// 刷新页面
[self.tableView reloadData];
} // 接收好友的信息
// 这个代理方法会被执行多次,每添加完好友,相对应的好友信息都要有反馈
- (void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(DDXMLElement *)item
{
/*
both 互为好友
none 互不为好友
to 我已经添加对方为好友,但是对方还没有接受
from 对方已经添加我为好友,但是我还没有接受
remove 曾经删除的好友
*/ // 描述自己和对方之间的关系
NSString *description = [[item attributeForName:@"subscription"] stringValue]; NSLog(@"description = %@", description); if ([description isEqualToString:@"to"] || [description isEqualToString:@"none"] || [description isEqualToString:@"both"] || [description isEqualToString:@"from"]) { // 添加好友
// 获取添加好友的JID
NSString *friendJID = [[item attributeForName:@"jid"] stringValue]; XMPPJID *jid = [XMPPJID jidWithString:friendJID]; // 如果数组中有这个用户,就不用再进行操作
if ([self.allRosterArray containsObject:jid]) {
return;
} // 添加好友到数组
[self.allRosterArray addObject:jid]; // 在tableView中添加这条数据
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.allRosterArray.count - inSection:]; [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
}
} // 收到好友的监听请求(加好友请求),是否同意
- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence
{
self.fromJID = presence.from;
// 需要相关的提醒框去确定是否接受
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"好友请求" message:@"是否接受好友请求" preferredStyle:UIAlertControllerStyleAlert]; __weak typeof(self)weakSelf = self; UIAlertAction *acceptAction = [UIAlertAction actionWithTitle:@"接受" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { // 在花名册中去接受相关的好友
[[XMPPManager shareXMPPManager].xmppRoster acceptPresenceSubscriptionRequestFrom:weakSelf.fromJID andAddToRoster:YES];
}]; UIAlertAction *rejectAction = [UIAlertAction actionWithTitle:@"拒绝" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [[XMPPManager shareXMPPManager].xmppRoster rejectPresenceSubscriptionRequestFrom:weakSelf.fromJID];
}]; [alertController addAction:acceptAction];
[alertController addAction:rejectAction]; [self presentViewController:alertController animated:YES completion:nil];
}
3> 添加好友所需方法
代码:
- (void)addFriend
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"添加好友" message:@"请输入添加好友的名字" preferredStyle:UIAlertControllerStyleAlert]; __weak typeof(self)mySlef = self; [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
mySlef.textField = textField;
}]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"取消删除好友!");
}]; UIAlertAction *ensureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { // 使用JID记录
XMPPJID *friendJID = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", mySlef.textField.text, kDomin]];
// 监听好友的动作
[mySlef.xmppRoster subscribePresenceToUser:friendJID];
// 添加好友
[mySlef.xmppRoster addUser:friendJID withNickname:mySlef.textField.text]; }]; [alertController addAction:ensureAction];
[alertController addAction:cancelAction]; [[self getCurrentVC] presentViewController:alertController animated:YES completion:nil];
}
4> 删除好友
代码:
#pragma mark - 删除好友
- (void)removeFriendWithName:(NSString *)name
{
// 使用JID记录
XMPPJID *friendJID = [XMPPJID jidWithUser:name domain:kDomin resource:kResource]; // 停止监听好友
[self.xmppRoster unsubscribePresenceFromUser:friendJID]; // 删除好友
[self.xmppRoster removeUser:friendJID];
}
2. 聊天
1> 聊天的规则:
从服务器获取聊天记录,根据数据属性判断消息类型
发送消息
接收消息
2> 初始化消息归档
// 获取管理消息的存储对象
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
// 消息管理器的初始化
self.messageArchiving = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:storage dispatchQueue:dispatch_get_main_queue()];
// 激活通道
[self.messageArchiving activate:self.xmppStream];
// 设置代理
[self.messageArchiving addDelegate:self delegateQueue:dispatch_get_main_queue()];
// 设置消息管理上下文
self.context = [storage mainThreadManagedObjectContext];
3> 获取聊天记录
获取聊天记录使用CoreData的方式
创建请求
创建实体描述,实体名: XMPPMessageArchiving_Message_CoreDataObject
创建谓词查询条件,条件:streamBareJidStr == 本人Jid AND bareJidStr == 好友Jid
创建排序对象,排序条件:timestamp
执行请求
代码:
#pragma mark - 显示消息
- (void)showMessage
{
// 获取管理上下文
NSManagedObjectContext *contxt = [XMPPManager shareXMPPManager].context; // 初始化请求对象
NSFetchRequest *request = [NSFetchRequest new]; // 获取实体
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject" inManagedObjectContext:contxt]; // 设置查询请求的实体
[request setEntity:entity]; // 设置谓词查询
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"streamBareJidStr == %@ AND bareJidStr == %@", [XMPPManager shareXMPPManager].xmppStream.myJID.bare, self.chatToJID.bare];
[request setPredicate:predicate]; // 按照时间顺序排序
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:YES];
[request setSortDescriptors:@[sort]]; // 执行相关的操作
NSArray *resultArray = [contxt executeFetchRequest:request error:nil]; // 先清空消息数组
[self.allMessageArray removeAllObjects]; // 添加context执行结果数组
[self.allMessageArray addObjectsFromArray:resultArray]; // 刷新UI
[self.tableView reloadData]; // 当前聊天记录跳到最后一行
if (self.allMessageArray.count > ) {
NSIndexPath * indexPath = [NSIndexPath indexPathForRow:self.allMessageArray.count- inSection:];
// 跳到最后一行
[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
}
}
4> 发送消息
#pragma mark - 发送点击方法
- (void)sendMessageAction
{
// 设置message的body
XMPPMessage *message = [XMPPMessage messageWithType:@"chat" to:self.chatToJID]; // 发送的内容,一般是从输入框获取,这里我们就写成固定的值
[message addBody:@"可以"]; // 通过通道进行消息发送
[[XMPPManager shareXMPPManager].xmppStream sendElement:message];
}
5> 接收/发送消息的回调
代码:
#pragma mark 发送消息成功
- (void)xmppStream:(XMPPStream *)sender didSendMessage:(XMPPMessage *)message
{
// 重新显示相关消息
[self showMessage];
} #pragma mark 接受消息成功
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
[self showMessage];
} #pragma mark 发送消息失败
- (void)xmppStream:(XMPPStream *)sender didFailToSendMessage:(XMPPMessage *)message error:(NSError *)error
{
NSLog(@"发送消息失败");
}
6> 消息气泡
aaarticlea/png;base64,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EDAEDAFDwBAwBKonAkZ6q2e+21MbAoaAIWAIGAKGgCFQrRAw0lutstse1hAwBAwBQ8AQMAQMgeqJgJHe6pnv9tSGgCFgCBgChoAhYAhUKwSM9Far7LaHNQQMAUPAEDAEDAFDoHoiYKS3euZ73qf+888/3UMPPZQ3TCEnhwwZUkiwEGb69OnuhRdeKDi8BTQEDAFDYElDYObMmW7QoEEVeqw//vjDvfXWWxWKwy42BJZUBGpkvMnD1ahRw6ldOWy/1RCBffbZxz311FN5n/ziiy92K6+8sjvqqKNSwx155JHurrvuSj2nD86ePdt16dLF9erVy7Vo0UKfCtvNmjVzrVq1KnHcDiweCNh3ZfHIJ0vlokfgxBNPdN9//71bc8013dy5c13nzp3d1ltv7S666KKQuHnz5rlatWqF7dq1a7tLLrkkbN94443u559/dmPHjnWtW7cO13DtoYce6pZeemm3wgorJA+HwLDqqqu6K664IjlmG4bAkoyAroOM9C7JOV3Ks33wwQc5FV2Ugo022sg1bNiwRCwHH3yw23zzzcPx22+/3X366afuhhtucO+//7776quvkvD3339/+OjKgaZNm7r99ttPdsMvhLdnz55u2223dcstt1zWOXZohF166aXuvffec8sss0yJ83ag6iOgPzhVP7WWQkNg0SDwxhtvuCeeeMJBYLF3333XPfvss+7yyy8P+9OmTXOnn366u/POO8M+39yNN97YbbPNNu6jjz5y7du3d//5z39cv3793DfffOPGjRvn2rVr544++mg3YMAAV7du3XAdBLpDhw5u5513Dvv2jyGwpCOg66DaS/rD2vPlRmCTTTZxa6yxRhIAArveeuuFj2hyMGVDk1M+qB9//LEbPnx4UCc0ScZdQcgx0ehz7H/++eeud+/ermXLlg4inUZqhw4d6rp37556jjjMDAFDwBBY3BGYNWtWILeQXmz8+PHutttuc3fccUfyaPfcc4/bd999k/3ll1/e1alTx1Gh33333a5t27bJuQcffDAQ4EaNGrkzzzzTHXPMMY7r6XlbZZVVjPAmSNlGdUPASG91y3H1vHSPNWnSJDny999/hw+iPpaczLOx6aabJmf5oIoRD0pEmr300ktBfXj00UfdmDFj3GGHHRZU4b322isJjsoxePBgd9111yXHbMMQMAQMgSUNAUQDBIhTTjnF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L774osSx+MCff/7pRo0alRx+7rnn3NSpU5P9smx8+OGHbvLkyQVf8sEHH7jffvstK/yXX37pfvzxx6xjtmMIlIZA7dIC2HlDwBAwBBYHBI466ih35513FpzUGTNmuKuuusqNGDHC7bHHHu6II44o9dpMJuO++uor9/bbb7tGjRq5rbfe2q288sqlXldIgD/++COQiFVWWSUJPmvWLEc6V1pppeSYDvfzzz+7mTNnupYtWybn443Bgwe7mjVruk6dOsWnkv2nn37aLbXUUm633XZLjpV147LLLgukqEGDBqmX/vXXX27ttdd2p5xySup5OfjLL7+4AQMGuB133FEO5fydM2eOu+GGG1zjxo3dFVdcEfKEwBA0cDz//PMdhGmTTTZxn3/+uatVq1Y4TpiBAwe6F198kc3EvvvuO7fCCiu45ZZbLjnGxhlnnOFatGgRjt14442hzEiAefPmuRo1agSMOUaaateuHY5JGMrXnnvuKbvutttuc9tvv72bNGmSO/XUU13r1q2Tc7IBweSZOnToEA79/fff7vTTT3fk/9JLLx3ut+KKK7rNN9/c/e9//3OUTf7Ia36bN2/uLrjgAoku/I4fP9699dZbJcrC9ddf7+66666ssPHOAw88ELBbY4013LPPPhvy8bjjjkuCgUHnzp3dxhtvnByDkH/22WfJvmw89thjbv3113frrbeeHAq/4LbhhhuGbe7RsGHDgNM777wT8rZu3bruyiuvdOedd14oI//+97+zrl9cdsif4cOHO56L8sZ3hLysLJs2bZpbdtllkzKp46UMrLbaavpQzu1PPvnEbbTRRqnxxBfxzvXu3dv1798/PlXwPuWVhmn9+vVTr5k9e3ZIz7HHHpt6vpCDRnoLQcnCGAKGQJVHAAJYFvvvf//rNttsM3fxxRdnXUZF1LFjx6xj7Pz++++uZ8+ebq211gqkAaXuoIMOct26dXO68i9xYYEHRo4cGSrySy65JLkCMoOidc011yTHXnvttVAx9OrVKyii48aNc2eeeWZyPt6AWEGExNKeD+JcVsVQ4pPfsWPHlkqcSLM2VNqPP/5YH3Jff/21o9KGzKYZlfnhhx8eTr3//vuB0L7++uuORs8222zjRo8e7Vq1ahXyhUAokpBtbaiMkHPyTtvjjz/uNt1003C9Pg5hFzvppJNkM/w++OCDDiK45ZZbhn0q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" alt="" />
代码:
//重写message方法,在cell上显示聊天记录
- (void)setMessage:(NSString *)message
{
if (_message != message) {
_message = message;
self.contentLabel.text = _message;
// self.contentLabel.numberOfLines = 0;
[self.contentLabel sizeToFit]; CGRect rect = self.frame;
if (self.isOut) {//发出去的
self.backgroundImageView.image = [[UIImage imageNamed:@"chat_to"] stretchableImageWithLeftCapWidth: topCapHeight:];
self.backgroundImageView.frame = CGRectMake(rect.size.width - self.contentLabel.frame.size.width - -, , self.contentLabel.frame.size.width+, rect.size.height-);
}else{//接收的
self.backgroundImageView.image = [[UIImage imageNamed:@"chat_from"] stretchableImageWithLeftCapWidth: topCapHeight:];
self.backgroundImageView.frame = CGRectMake(, ,self.contentLabel.frame.size.width+, rect.size.height-);
}
//因为contentLabel已经自适应文字大小,故不用设置宽高,但需要设置位置
self.contentLabel.center = CGPointMake(self.backgroundImageView.frame.size.width/2.0, self.backgroundImageView.frame.size.height/2.0); }
}
以上代码均为练习代码的部分代码!完整练习代码github下载地址: https://github.com/AlonerOwl/UISenior11_-_1
由于只是练习代码,对于界面和部分功能没有优化,看起来比较low,如果有需求,请自己进行优化。
代码效果图:
【原】iOS学习43即时通信之XMPP(2)的更多相关文章
- 【原】iOS学习42即时通信之XMPP(1)
1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...
- java学习之即时通信项目实战
项目总结:这次项目主要是根据视频来的,结果跟到一半感觉跟不上,慢慢自己有了自己的想法,决定自己先不看学习视频,自己先试着写. 总结写前面,算是写的第一个项目吧.项目中遇到几点问题,首先Scoket对 ...
- iOS 使用 socket 即时通信(非第三方库)
其实写这个socket一开始我是拒绝的. 因为大家学C 语言和linux基础时肯定都有接触,客户端和服务端的通信也都了解过,加上现在很多开放的第三方库都不需要我们来操作底层的通信. 但是来了!!! 但 ...
- iOS学习之界面通信
一.属性传值 在SecondViewController.h里 #import <UIKit/UIKit.h> @interface SecondViewController : UIVi ...
- 即时通信(IM)和实时通信(RTC)的区别
即时通信(IM=nstant messaging)和实时通信(rtc=Real-time communication)都是一套网络通信系统,其本质都是对信息进行转发.其最大的不同点,是对信息传递的时间 ...
- iOS开发-即时通信XMPP
1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...
- iOS开发之使用XMPPFramework实现即时通信
iOS开发之使用XMPPFramework实现即时通信 关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让 ...
- iOS开发之使用XMPPFramework实现即时通信(三)
你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...
- iOS开发之使用XMPPFramework实现即时通信(二)
上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...
随机推荐
- c++中有些重载运算符为什么要返回引用
事实上,我们的重载运算符返回void.返回对象本身.返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值. 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进 ...
- Android单元测试
安卓单元测试总结文章,目测主要会cover以下的主题: 什么是单元测试 为什么要做单元测试 JUnit Mockito Robolectric Dagger2 一个具体的app例子实践 神秘的bonu ...
- php单双引号
1.定义字符串 定义字符串时,只有一种引号被视为定义符,即单引号或双引号.于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析.这样,你就可以在双引号串中包含任何其他字符,甚至单引号.下面的引 ...
- 与你相遇好幸运,Sail.js创建.sailsrc文件
在项目根目录下创建.sailsrc文件 { "generators": { "modules": {} }, "hooks": ...
- Android bluetooth用户自定义数据
default mac: [btif_core.c] btif_fetch_local_bdaddr() default device name: [btif_dm.c] btif_get_defau ...
- 【PHP&&mysqli】
msyqli和mysql只有一个字母的差别,真正的含义是msyql的增强版扩展. MySQL可以处理满足程序员对MySQL数据库操作的各种需要了,为什么还需要mysqli呢?因为mysqli支持面性对 ...
- sdut 2498【aoe 网上的关键路径】
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2498 代码超时怎么破: #include< ...
- 无废话ExtJs 入门教程三[窗体:Window组件]
无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...
- poj 1007:DNA Sorting(水题,字符串逆序数排序)
DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 80832 Accepted: 32533 Des ...
- 攻城狮在路上(贰) Spring(一)--- 软件环境、参考书目等一览表
一.软件环境: 二.参考书目: <Spring 3.X 企业应用开发实战> 陈雄华.林开雄著 电子工业出版社出版 三.其他说明: spring 源码地址:https://github.co ...