XMPP的iOS即時(shí)通訊APP吱吱(一)

XMPPFrameWork冲粤、MBProgressHUD等框架實(shí)現(xiàn)了目前來看丑丑的即時(shí)聊天APP袜茧,名字就叫吱吱摧冀,因?yàn)槲茵B(yǎng)的一只倉鼠”蹲伲現(xiàn)在就是界面丑到爆系宫,是用storyboard結(jié)合代碼做的,有興趣的可以聯(lián)系我或者在github上fork建车。
初步的界面gif如下:

屏幕錄像.gif

因?yàn)樽约寒嫻ぬ美┙瑁琹ogo盜用了某日漫的,去吧缤至!比卡丘潮罪!誰來拯救我的少女心~


appicon

首先,一個(gè)聊天app由服務(wù)器和客戶端組成

一领斥、服務(wù)器端配置

服務(wù)器我們就用著名的openfire嫉到,數(shù)據(jù)庫就用mysqlwork bench管理,具體的安裝設(shè)置步驟百度都能搜到月洛,我下的openfire啟動不了何恶,找了個(gè)方法:

sudo su 接著輸入密碼;

cd /usr/local/openfire

export JAVA_HOME=/usr/libexec/java_home

echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home

cd /usr/local/openfire

./openfire.sh

第一次設(shè)置openfire時(shí)嚼黔,記得加上編碼方式细层,有用的(解決中文亂碼):jdbc:mysql://127.0.0.1:3306/openfire1?useUnicode=true&characterEncoding=utf8

二、客戶端開發(fā)配置

iOS端開發(fā)我們要引用哪些第三方框架隔崎,怎么導(dǎo)入這些框架今艺,我用的cocoapods導(dǎo)入,需要導(dǎo)入哪些呢爵卒,首先是最總要的XMPPFramework虚缎,然后一些效果UIBubbleTableView(聊天氣泡框)、MBProgressHUD(菊花效果提示框)钓株。不知道怎么導(dǎo)入可以看看AFNetworking的readme文檔实牡,照著寫就ok了。

三轴合、我要實(shí)現(xiàn)哪些功能

登陸要的创坞,注冊要的,注銷要的受葛,聊天要的题涨,這是我想要的五大功能,如果你想要好友总滩、頭像之類的纲堵,可以進(jìn)一步深入。

ServerController類闰渔。

1席函、單例模式。

為什么要用單例冈涧?我一有請求就創(chuàng)建一個(gè)服務(wù)器類茂附,一個(gè)用戶發(fā)起100個(gè)請求正蛙,那不得創(chuàng)建一百個(gè)實(shí)例,自登陸到注銷我們用一個(gè)實(shí)例就好了营曼。


+ (instancetype)shareSever{

static ServerController *sc=nil;

static dispatch_once_t once;

dispatch_once(&once,^{

sc = [[ServerController alloc]init];

});

return sc;

}

2乒验、重寫init方法(關(guān)鍵),我是照著別人的寫的:

-(instancetype)init{
    self = [super init];
    if (self) {
        self.xmppStream = [[XMPPStream alloc]init];
        // 設(shè)置stream的代理
        [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
        
        // 系統(tǒng)寫好的xmpp存儲對象
        XMPPRosterCoreDataStorage *rosterCoreDataStorage = [XMPPRosterCoreDataStorage sharedInstance];
        self.xmppRoster = [[XMPPRoster alloc]initWithRosterStorage:rosterCoreDataStorage dispatchQueue:dispatch_get_main_queue()];
        
        //激活roster
        [self.xmppRoster activate:self.xmppStream];
        
        // 初始化聊天記錄管理對象
        XMPPMessageArchivingCoreDataStorage * archiving = [XMPPMessageArchivingCoreDataStorage sharedInstance];
        self.messageArchiving = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:archiving dispatchQueue:dispatch_get_main_queue()];
        
        // 激活管理對象
        [self.messageArchiving activate:self.xmppStream];
        
        // 給管理對象添加代理
        [self.messageArchiving addDelegate:self delegateQueue:dispatch_get_main_queue()];
        self.messageContext = archiving.mainThreadManagedObjectContext;
        
    }
    return self;
}

3溶推、connect方法徊件,準(zhǔn)確的說應(yīng)該是登陸、注冊方法

-(void) connect:(NSString *)user :(NSString *)password :(NSInteger)purpose{
    self.password=password;
    self.purpose=purpose;     //目的參數(shù)蒜危,是登陸還是注冊虱痕。
    
    if([self.xmppStream isConnected]){
        [self.xmppStream disconnect];
    }
    XMPPJID *jid = [XMPPJID jidWithUser:user domain:@"127.0.0.1" resource:@"openfire1"];
    [self.xmppStream setMyJID:jid];
    [self.xmppStream setHostName:@"127.0.0.1"];
    NSError *error = nil;
    [self.xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error];
    if (error) {
        NSLog(@"error = %@",error);
    }
}

4、xmpp的各種代理函數(shù):

- (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender{
    NSLog(@"連接服務(wù)器失敗的方法辐赞,請檢查網(wǎng)絡(luò)是否正常");
}
- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket{
    NSLog(@"連接成功");
}

- (void)xmppStreamDidConnect:(XMPPStream *)sender{
    
    NSLog(@"再發(fā)送密碼授權(quán)");
    NSError *err = nil;
    switch (self.purpose) {
        case 1:
            [_xmppStream authenticateWithPassword:self.password error:&err];
            break;
        case 2:
            [_xmppStream registerWithPassword:self.password error:&err];
            
        default:
            break;
    }
    if (err) {
        NSLog(@"%@",err);
    }
}

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
    [_xmppStream sendElement:presence];
    NSLog(@"登陸成功%@",presence);
    
}

-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
    NSLog(@"授權(quán)失敗 %@",error);
    [_xmppStream disconnect];
    
}
- (void) xmppStreamDidRegister:(XMPPStream *)sender{
    NSLog(@"注冊成功");
    
}
- (void) xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error{
    NSLog(@"注冊失敗");
}
- (void) registerAction:(NSString *)user :(NSString *)password{
    
}

- (void) XMPPAddFriendSubscribe:(NSString *)name{
    XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%s",name,"127.0.0.1"]];
    //[presence addAttributeWithName:@"subscription" stringValue:@"好友"];
    [self.xmppRoster subscribePresenceToUser:jid];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末部翘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子响委,更是在濱河造成了極大的恐慌新思,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赘风,死亡現(xiàn)場離奇詭異夹囚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)邀窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門荸哟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞬捕,你說我怎么就攤上這事鞍历。” “怎么了肪虎?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵劣砍,是天一觀的道長。 經(jīng)常有香客問我扇救,道長刑枝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任迅腔,我火速辦了婚禮仅讽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钾挟。我一直安慰自己,他們只是感情好饱岸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布掺出。 她就那樣靜靜地躺著徽千,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汤锨。 梳的紋絲不亂的頭發(fā)上双抽,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音闲礼,去河邊找鬼牍汹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛柬泽,可吹牛的內(nèi)容都是我干的慎菲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼锨并,長吁一口氣:“原來是場噩夢啊……” “哼露该!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起第煮,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤解幼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后包警,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撵摆,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年害晦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了特铝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篱瞎,死狀恐怖苟呐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俐筋,我是刑警寧澤牵素,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站澄者,受9級特大地震影響笆呆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粱挡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一赠幕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧询筏,春花似錦榕堰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圾旨。三九已至,卻和暖如春魏蔗,著一層夾襖步出監(jiān)牢的瞬間砍的,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工莺治, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廓鞠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓谣旁,卻偏偏與公主長得像床佳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蔓挖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容