昨天完成了聊天界面,基本功能算告一段落

开发时间:五天(工作时间)

开发工具:xcode6

开发平台:iOS8

XMPP框架:XMPPFramework

git clone https://github.com/robbiehanson/XMPPFramework.git

界面设计:使用StoryBoard

github地址:https://github.com/hjandyz/XMPP

1.关于socket在后台的运行,iOS8可以直接使用(但是我自由在模拟器成功,真机不知为何不可以),ios7的话需要配置

其实很方便,初始化xmppstream以后

_XMPPStream.enableBackgroundingOnSocket = YES;

然后修改plist文件

2.获得后台运行的权限以后我们就可以接收到message了

#pragma mark 接收到好友消息

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message

{

//判断是否在前台

if([UIApplication sharedApplication].applicationState != UIApplicationStateActive){

HJLog(@"后台");

UILocalNotification *localNoti = [[UILocalNotification alloc] init];

localNoti.alertBody = [NSString stringWithFormat:@"%@:%@",message.fromStr,message.body];

localNoti.soundName = @"default";

[[UIApplication sharedApplication] scheduleLocalNotification:localNoti];

}

}

当然iOS8要注册一下通知,用户允许才能发通知给用户

//注册应用接受通知

if([[UIDevice currentDevice].systemVersion doubleValue] > 8.0){

UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil];

[application registerUserNotificationSettings:setting];

}

3.发消息的时可以自己在xml文件中加入body,这样子可以区分图片声音还是文字或者其他格式

- (void)shendMessage:(NSString *)text bodyType:(NSString *)bodyType

{

XMPPMessage *message = [XMPPMessage messageWithType:@"chat" to:self.friendJid];

[message addAttributeWithName:@"chatType" stringValue:bodyType];

[message addBody:text];

[[HJXMPPTool sharedHJXMPPTool].XMPPStream sendElement:message];

}

4.一些小方法,为了显示新的消息自动混动到底部,用户拖动scrollView时候隐藏键盘

#pragma mark - 滚动到底部

- (void)scrollToTableViewBotton

{

NSInteger lastRow = _resultController.fetchedObjects.count - 1;

if (lastRow < 0) {

return;

}

NSIndexPath *path = [NSIndexPath indexPathForRow:lastRow inSection:0];

[self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionBottom animated:YES];

}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

[self.view endEditing:YES];

}

3.通过的到contentSize来让输入框最多变高成三行

#pragma mark - textView delegate

- (void)textViewDidChange:(UITextView *)textView

{

CGFloat contentH = textView.contentSize.height;

//    NSLog(@"%f",size.height);

if (contentH > 33 && contentH < 67) {

self.inputViewHeightConstraint.constant = contentH + 18;

}

NSString *text = textView.text;

if([text rangeOfString:@"\n"].length != 0){

//去除换行字符

text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

[self shendMessage:text bodyType:@"text"];

textView.text = nil;

self.inputViewHeightConstraint.constant = 50;

}

}

4.用代码实现自动布局(VLF)也是很有用的

#warning 代码实现自动布局,要设置下面为NO

tableView.translatesAutoresizingMaskIntoConstraints = NO;

//自动布局 VFL

NSDictionary *views = @{@"tableView":tableView, @"inputView":inputView};

NSArray *tableHConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[tableView]-0-|" options:0 metrics:nil views:views];

[self.view addConstraints:tableHConstraints];

NSArray *inputHConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[inputView]-0-|" options:0 metrics:nil views:views];

[self.view addConstraints:inputHConstraints];

NSArray *vConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[tableView]-0-[inputView(50)]-0-|" options:0 metrics:nil views:views];

[self.view addConstraints:vConstraints];

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

[XMPP]iOS聊天软件学习笔记[四]的更多相关文章

  1. [XMPP]iOS聊天软件学习笔记[一]

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  2. [XMPP]iOS聊天软件学习笔记[三]

    今天做了好友界面,其实xmpp内部已经写好很多扩展模块,所以使用起来还是很方便的 开发时间:五天(工作时间) 开发工具:xcode6 开发平台:iOS8 XMPP框架:XMPPFramework gi ...

  3. [XMPP]iOS聊天软件学习笔记[二]

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  4. 【转】ios蓝牙开发学习笔记(四)ios蓝牙应用的后台处理 -- 不错

    原文网址:http://dev.ailab.cn/article-1038-220511-1.html 默认情况下,当应用进入后台或挂起时,蓝牙任务是不执行的.但是,你可以把应用声明为支持蓝牙后台执行 ...

  5. Java超简明入门学习笔记(四)

    Java编程思想第4版学习笔记(四) 第六章 访问权限控制         访问权限控制是面向对象编程中的重要概念,它划分了类设计者和类使用者的界限.通过设置权限,它一方面告诉类设计者,哪个部分的修改 ...

  6. JavaWeb和WebGIS学习笔记(四)——使用uDig美化地图,并叠加显示多个图层

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  7. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  8. X-Cart 学习笔记(四)常见操作

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...

  9. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

随机推荐

  1. zip格式压缩、解压缩(C#)

    压缩方法 #region 压缩 /// <summary> /// 压缩 /// </summary> /// <param name="bytes" ...

  2. tomcat server.xml 配置示例

    规划:     网站网页目录:/web/www      域名:www.test1.com     论坛网页目录:/web/bbs     URL:bbs.test1.com/bbs     网站管理 ...

  3. Effective Java2读书笔记-类和接口(一)

    第13条:使类和成员的可访问性最小化 设计良好的模块的模块与设计不好的模块区别在于,设计良好的模块会隐藏所有的实现细节,把它的API与他的实现清晰地隔离开来.然后模块之间只通过API通信. 信息隐藏之 ...

  4. 2015北大夏令营day1 B:An Idea of Mr. A

    题意:给定一个范围l,r计算i,j(i<j)属于这个范围内的gcd(2^(2^i)+1,2^(2^j)+1)的总和. 思路:费马数的应用,让我惊呆的是当年居然有123个人会做,我tm毛都不会.. ...

  5. cmake编译Debug和Release

    CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release Rel WithDebInfo 和 MinSizeRel.当这个变量值为 Debug 的时候,C ...

  6. Android CursorAdapter

    CursorAdapter 继承于BaseAdapter是个虚类,它为cursor和ListView提供了连接的桥梁.            public abstract class     Cur ...

  7. cookielib模块基础学习

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import cookielib #主要用于处理http客户端的co ...

  8. EffectiveC#01--避免返回内部类对象的引用

    此篇是对00中第3点的再一次阐述. 1.如果一个属性返回一个引用类型,那么调用者就可以访问这个对象的公共成员,也包括修改这些属性的状态. public class MyBusinessObject { ...

  9. 面试前的准备---C#知识点回顾----03

    经过一天的奔波,喜忧参半,不细表 再回看下标题,C#知识点回顾 再看下内容,数据库3NF 原谅我这个标题党 今天继续回忆 1.HTTP中Post和Get区别 这忒简单了吧,大家是不是感觉到兴奋了,长舒 ...

  10. ASP.NET MVC 部分视图(转)

    [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 User Control.我们的页面往往会有许多重用的地方,可以进行封装重用.使用 部分视图 :  1. 可以简写代 ...