XMPP的iOS即时通讯APP吱吱(一)

XMPPFrameWork、MBProgressHUD等框架实现了目前来看丑丑的即时聊天APP,名字就叫吱吱,因为我养的一只仓鼠。现在就是界面丑到爆,是用storyboard结合代码做的,有兴趣的可以联系我或者在github上fork。
初步的界面gif如下:

屏幕录像.gif

因为自己画工太好,logo盗用了某日漫的,去吧!比卡丘!谁来拯救我的少女心~


appicon

首先,一个聊天app由服务器和客户端组成

一、服务器端配置

服务器我们就用著名的openfire,数据库就用mysqlwork bench管理,具体的安装设置步骤百度都能搜到,我下的openfire启动不了,找了个方法:

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

第一次设置openfire时,记得加上编码方式,有用的(解决中文乱码):jdbc:mysql://127.0.0.1:3306/openfire1?useUnicode=true&characterEncoding=utf8

二、客户端开发配置

iOS端开发我们要引用哪些第三方框架,怎么导入这些框架,我用的cocoapods导入,需要导入哪些呢,首先是最总要的XMPPFramework,然后一些效果UIBubbleTableView(聊天气泡框)、MBProgressHUD(菊花效果提示框)。不知道怎么导入可以看看AFNetworking的readme文档,照着写就ok了。

三、我要实现哪些功能

登陆要的,注册要的,注销要的,聊天要的,这是我想要的五大功能,如果你想要好友、头像之类的,可以进一步深入。

ServerController类。

1、单例模式。

为什么要用单例?我一有请求就创建一个服务器类,一个用户发起100个请求,那不得创建一百个实例,自登陆到注销我们用一个实例就好了。


+ (instancetype)shareSever{

static ServerController *sc=nil;

static dispatch_once_t once;

dispatch_once(&once,^{

sc = [[ServerController alloc]init];

});

return sc;

}

2、重写init方法(关键),我是照着别人的写的:

-(instancetype)init{
    self = [super init];
    if (self) {
        self.xmppStream = [[XMPPStream alloc]init];
        // 设置stream的代理
        [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
        
        // 系统写好的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方法,准确的说应该是登陆、注册方法

-(void) connect:(NSString *)user :(NSString *)password :(NSInteger)purpose{
    self.password=password;
    self.purpose=purpose;     //目的参数,是登陆还是注册。
    
    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的各种代理函数:

- (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender{
    NSLog(@"连接服务器失败的方法,请检查网络是否正常");
}
- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket{
    NSLog(@"连接成功");
}

- (void)xmppStreamDidConnect:(XMPPStream *)sender{
    
    NSLog(@"再发送密码授权");
    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(@"授权失败 %@",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];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,332评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,930评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,204评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,348评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,356评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,447评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,862评论 3 394
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,516评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,710评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,518评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,582评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,295评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,848评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,881评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,121评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,737评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,280评论 2 341

推荐阅读更多精彩内容