XMPPFrameWork冲粤、MBProgressHUD等框架實(shí)現(xiàn)了目前來看丑丑的即時(shí)聊天APP袜茧,名字就叫吱吱摧冀,因?yàn)槲茵B(yǎng)的一只倉鼠”蹲伲現(xiàn)在就是界面丑到爆系宫,是用storyboard結(jié)合代碼做的,有興趣的可以聯(lián)系我或者在github上fork建车。
初步的界面gif如下:
因?yàn)樽约寒嫻ぬ美┙瑁琹ogo盜用了某日漫的,去吧缤至!比卡丘潮罪!誰來拯救我的少女心~
首先,一個(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];
}