1. 程式人生 > >XMPP接受傳送訊息

XMPP接受傳送訊息

  在現階段的通訊服務中,各種標準都有,因此會出現無法實現相互連通,而XMPP(Extensible Message and presence Protocol)協議的出現,實現了整個及時通訊服務協議的互通。有了這個協議之後,使用任何一個組織或者個人提供的即使通訊服務,都能夠無障礙的與其他的及時通訊服務的使用者進行交流。例如google 公司2005年推出的Google talk就是一款基於XMPP協議的即時通訊軟體。下面我們就談論一下如何簡單的使用XMPP的接收和傳送訊息

1、在XMPPFramework.h中將需要用到的標頭檔案開啟

 

2、在storyboard建立展示訊息頁面

 

3、定義查詢結果儲存器並且進行初始化

//訊息存檔
@property(nonatomic,strong) XMPPMessageArchiving * messageArch;

//訊息存檔儲存模型
@property(nonatomic,strong) XMPPMessageArchivingCoreDataStorage * messageStore;

4、在上面storyboard建立的控制器中,新增如下程式碼

AppDelegate * delgate=[UIApplication sharedApplication].delegate;
    
    //初始化頭像
    XMPPJID * fromJid=[XMPPJID jidWithString:self.fromJid];
    NSData 
* fromData=[delgate.vCardAvatarModule photoDataForJID:fromJid]; self.fromImage=[[UIImage alloc] initWithData:fromData]; NSString * userName= [[NSUserDefaults standardUserDefaults] objectForKey:@"userName"]; XMPPJID * tojid=[XMPPJID jidWithString:userName]; //設定圖片模型 NSData * toData=[delgate.vCardAvatarModule photoDataForJID:tojid]; self.meImage
=[[UIImage alloc] initWithData:toData]; if (self.fromImage==nil) { self.fromImage=[UIImage imageNamed:@"defalut"]; } if (self.meImage==nil) { self.meImage=[UIImage imageNamed:@"defalut"]; } [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showKey:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideKey:) name:UIKeyboardWillHideNotification object:nil]; //初始化資料儲存 NSString *user= [[NSUserDefaults standardUserDefaults] objectForKey:@"userName"]; //初始化請求 NSFetchRequest * request=[[NSFetchRequest alloc] initWithEntityName:@"XMPPMessageArchiving_Message_CoreDataObject"]; request.predicate=[NSPredicate predicateWithFormat:@"bareJidStr=%@ and streamBareJidStr=%@",self.fromJid,user]; //定義排序 NSSortDescriptor * des=[NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES]; [request setSortDescriptors:@[des]]; //獲取上下文 NSManagedObjectContext *context=[delgate.messageStore mainThreadManagedObjectContext]; //初始化結果儲存器 fetch=[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; //設定代理 fetch.delegate=self; //開始查詢 [fetch performFetch:nil];

5、創實現tableView的代理方法

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    id <NSFetchedResultsSectionInfo>  info=fetch.sections[section];
        NSLog(@"===%ld",info.numberOfObjects);
    return [info numberOfObjects];
    
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    XMPPMessageArchiving_Message_CoreDataObject * obj=[fetch objectAtIndexPath:indexPath];
    JRChatTableViewCell * cell=nil;
    if (obj.isOutgoing) {
         cell=[tableView dequeueReusableCellWithIdentifier:@"cellto"];
    }else{
         cell=[tableView dequeueReusableCellWithIdentifier:@"cellfrom"];
    }
    
    
    //設定頭像
    cell.image.image=self.meImage;
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    [cell setText:obj.body WithFlag:obj.isOutgoing ];
    return cell;

}

6、增加鍵盤控制

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showKey:) name:UIKeyboardWillShowNotification object:nil];
    
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideKey:) name:UIKeyboardWillHideNotification object:nil];
- (void) showKey:(NSNotification * ) notify{
    CGFloat time=[notify.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]  ;
    CGRect frame=[notify.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    [UIView animateWithDuration:time animations:^{
        self.keyView.transform=CGAffineTransformMakeTranslation(0, frame.size.height*-1);
    }];
}

- (void) hideKey:(NSNotification * ) notify{
    CGFloat time=[notify.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]  ;
    [UIView animateWithDuration:time animations:^{
        self.keyView.transform=CGAffineTransformIdentity;
    }];
}

7、傳送訊息

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    
    //傳送訊息
    
    //1 取出文字
    AppDelegate * delgate=[UIApplication sharedApplication].delegate;
    
    XMPPJID * jid=[XMPPJID jidWithString:self.fromJid];
    
    //初始化訊息體
    XMPPMessage * message=[XMPPMessage messageWithType:@"chat" to:jid];
    [message addBody:self.ketf.text];
    
    //傳送訊息
    [delgate.stream sendElement:message];
    
    //將訊息置空
    self.ketf.text=nil;
    return YES;
}

  想要了解更多內容的小夥伴,可以點選檢視原始碼,親自執行測試。

  疑問諮詢或技術交流,請加入官方QQ群:JRedu技術交流 (452379712)

作者:傑瑞教育
出處: 
本文版權歸煙臺傑瑞教育科技有限公司和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。

相關推薦

XMPP接受傳送訊息

  在現階段的通訊服務中,各種標準都有,因此會出現無法實現相互連通,而XMPP(Extensible Message and presence Protocol)協議的出現,實現了整個及時通訊服務協議的互通。有了這個協議之後,使用任何一個組織或者個人提供的即使通訊服務,都能夠無障礙的與其他的及時通訊服務的使用

Netty整合socket實現接受傳送訊息

注意及日誌輸出很詳細了 故不再講解: import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.haiyang.key.Model.Socket.*; import com.hai

兩個winform.exe程式之間的通訊一————————傳送訊息

1,兩個winform.exe在系統裡體現是兩個程序,而程序是是由系統管理。 2,user32.dll是Windows使用者介面相關應用程式介面,用於包括Windows處理,基本使用者介面等特性,如建立視窗和傳送訊息。 3,所有可以通過呼叫user32.dll的api來進行兩個程序之間的通訊

Java程式碼向指定的WebHook傳送訊息

1.我們通過Java來向某個WebHook地址傳送POST請求,並攜帶我們需要傳送的訊息 2.程式碼示例 搭建Maven專案,在pom.xml檔案裡引入httpclient依賴 <dependency> <groupId>org.apache.httpcompo

activemq傳送訊息接收不到問題排查

昨天,在公司開發環境上嘗試資料同步,涉及到兩個服務,服務A釋出主題,服務B監聽訊息,然後同步A表中的資料到B表; 由服務A通過activemq釋出訊息到一個topic:VirtualTopic.topic,發現服務A日誌上顯示傳送訊息成功,VirtualTopic.topic對應的Messa

使用python定時傳送訊息給微信好友

    以前以為微信沒有介面和python連線,但是最近發現了個庫wechat_sender,然後就稍微學習了下。還不深入,寫了一個簡易的測試程式作為初步進入。     需要用到的庫有 threading, wxpy前者需要用到Timer這個函式,作為定時

EventBus主頁面傳送訊息其他頁面接收訊息

今天心血來潮 懷著激動的心情來給碼友們甩一個小部落格!! 概念、優點等什麼的我就不說了網上一籮筐 廢話不說了 直接甩程式碼 1.匯入依賴 compile 'org.greenrobot:eventbu

nodejs EventEmitter 傳送訊息

var util = require('util'); var evem = require('events').EventEmitter; function myem(){ evem.call(this); } util.inherits(myem, evem); var em = new myem

rabbitmq 傳送訊息格式注意

在rabbitmq的網頁版中,有publish ,用了傳送。 delivery_mode: 2 headers: content_type:

Kafka傳送訊息過程

Kafka傳送訊息模型   ProducerRecord物件包含目標主題和要傳送的內容,還可以指定鍵或分割槽。傳送ProducerRecord物件時,生產者要先把鍵和值物件序列化為位元組陣列(預設使用StringSerialize

網路是怎樣連線的-第一章-委託協議棧傳送訊息

1.4 委託協議棧傳送訊息 1.4.1 資料收發操作概覽 獲得 IP 地址後,就可以委託作業系統內部的協議棧向這個目標 IP地址,也就是我們要訪問的 Web 伺服器傳送訊息。 要傳送給 Web 伺服器的 HTTP 訊息是一種數字資訊(digital data),因此也可以說是委託協議棧來發送數字資訊。

iOS —— RunTime詳解(傳送訊息)一

一、RunTime簡介 RunTime簡稱執行時。OC就是執行時機制,也就是在執行時候的一些機制,其中最主要的是訊息機制。 對於C語言,函式的呼叫在編譯的時候會決定呼叫哪個函式。 對於OC語言,屬於動態呼叫過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在真正

PB 傳送訊息到Rabbit M Q

說起PB 老古董了, 糾結了好久, PB人員說不會連線 MQ 。 這個事情拖了快一年了。 最近實在忍不過去了, 只能我這個 .net 程式設計師出手了。 百度了一下pb的語法和入門教程。 然後找了下RabbitMQ的手冊。 發現向RabbitMQ傳送訊息可以通過兩種方法, 一種是官方

Kafka學習筆記(5)----Kafka使用Producer傳送訊息

1. Kafka的Producer   不論將kafka作為什麼樣的用途,都少不了的向Broker傳送資料或接受資料,Producer就是用於向Kafka傳送資料。如下:    2. 新增依賴   pom.xml檔案如下: <!-- https://mvnrepository.com/

微信開發學習總結(三)——訊息管理(2)-接受普通訊息和被動回覆使用者訊息

上一節內容: 微信開發學習總結(三)——訊息管理(1) https://blog.csdn.net/qq_29914837/article/details/82903594 訊息管理具有的各個子模組功能,現在我們將一個詳細介紹如何使用 一、接受普通訊息介面介紹 1.1

網路層資料包接受/傳送API

網路層的資料包主要有三個流向:本機接受資料、前送資料包、本機產生資料包,其中資料包的流向要經過Netfiler的5個鏈子上的鉤子函式處理,5個鏈子分別是:NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF

shell或python呼叫企業微信傳送訊息(實現報警功能)

shell或python呼叫企業微信傳送訊息(實現報警功能) 官方文件 企業內部開發簡易教程:https://work.weixin.qq.com/api/doc#90000/90003/90487服務端API:https://work.weixin.qq.com/api/doc#90000/90135/

SSM框架下使用websocket實現後端傳送訊息至前端

本篇文章本人是根據實際專案需求進行書寫的第一版,裡面有些內容對大家或許沒有用,但是核心程式碼本人已對其做了紅色標註。文章講解我將從maven座標、HTML頁面、js檔案及後端程式碼一起書寫。 一、maven座標 <!-- WebSocket配置開始--> <dependency&g

Java模擬壓測裝置傳送訊息到伺服器(Rabbitmq) python模擬上報訊息到rabbitMQ(protobuf)

進入idea,新建一個maven專案 主要是模擬150個裝置同時併發,併發時間持續15min 1.建立客戶端,構造請求傳送到對應的rabbitmq的佇列,用的protobuf協議。 import com.google.protobuf.ByteString; import com.

iOS原生OC向React Native傳送訊息、事件、通知

RCTEventEmitter 此篇僅獻給剛剛入門的同志們。 大家在使用React Native的時候,都會比較關心原生和React Native的互動問題。React Native給原生髮送訊息,在中文官網上講得也比較明白,按照上面的例子,相信大家都可以實現出來。但是在原生給React Native傳送