[XMPP]iOS聊天软件学习笔记[四]

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

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

开发工具: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]; 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。