一,關(guān)于推送
之前做過(guò) 極光 ?APNS ?個(gè)推的 推送 ?: 這里說(shuō)下 極光推送是比較 適合用在 iOS 端和 ?安卓端的, 而個(gè)推 那就只能完美支持安卓端 ?,安卓端可以 ?消息通知 ?和 ? 消息的傳透, 而iOS 只能消息傳透(ps:什么是消息傳透 看下下圖我做的demo:) ?

二、好了進(jìn)入主題。關(guān)于環(huán)信的消息推送機(jī)制
?首先給大家推薦一個(gè)介紹推送機(jī)制很優(yōu)秀的帖子:http://m.itdecent.cn/p/e347f999ed95,里面關(guān)于本地推送和遠(yuǎn)程推送的介紹都很詳細(xì),至少我看了感覺(jué)還是收獲很多的.
下面是以QQ服務(wù)器為我們說(shuō)明的即時(shí)通訊的機(jī)制:

其實(shí),做開(kāi)發(fā)的人看了圖就會(huì)明白,消息的機(jī)制就是這么簡(jiǎn)單 ?,推送識(shí)別的就是設(shè)備,并不是用戶??!
三、具體的流程
在xcode下 新建一個(gè)demo,隨便命名 ?我就叫 簡(jiǎn)單聊 ?因?yàn)?我想做一個(gè)這樣的APP。
1. 創(chuàng)建AppID ?和描述文件
我們是要集成推送的,所以我們需要用到cer文件,這個(gè)東西實(shí)際上就是蘋果給開(kāi)發(fā)者頒發(fā)的一個(gè)證書(shū),我們需要將它導(dǎo)入到我們的AppId配置里,否則的話是無(wú)法集成推送的,還記得安裝應(yīng)該的時(shí)候會(huì)提示"無(wú)法安裝為認(rèn)證發(fā)布者的應(yīng)用"之類的信息么,我猜測(cè)這個(gè)cer文件就是我們身份的標(biāo)示,使我們開(kāi)發(fā)的應(yīng)用可以供人們正常安裝使用,關(guān)于證書(shū)有一篇很詳細(xì)的帖子,希望了解證書(shū)之類信息的看官可以去瞅瞅:http://m.blog.csdn.net/article/details?id=8617788
申請(qǐng)證書(shū)流程我就不寫上去了 ?,因?yàn)楦綍r(shí)我們上傳證書(shū)什么的沒(méi)什么區(qū)別


2.創(chuàng)建appID ?和描述文件








最后配置出來(lái)的 證書(shū)是 ? 下圖:


最后配置一下 生成證書(shū):

4.在環(huán)信創(chuàng)建我們的應(yīng)用
注冊(cè)一個(gè)官網(wǎng)的賬號(hào),注冊(cè)過(guò)了就直接干??! ?注冊(cè)時(shí)候選擇 ?“注冊(cè)即時(shí)通訊云”。

然后就是創(chuàng)建應(yīng)用 ?如下圖:

填寫完成如下

上傳證書(shū):


5,集成環(huán)信到項(xiàng)目中:
首先在這里下載最新的SDK(截至到寫本文時(shí)最新的SDK為)
http://www.easemob.com/download/im環(huán)信推送SDK下載鏈接
點(diǎn)擊iOS的最新SDK下載,這里下載的是V3.x的SDK
我們只需要下面兩個(gè)圈的文件 ?導(dǎo)入demo


導(dǎo)入之后會(huì)有很多錯(cuò)誤 ?,慢慢改過(guò)來(lái)吧

這一步很重要,因?yàn)镾DK 不支持 bitcode,所以要將 Build Settings → Linking → Enable Bitcode 中設(shè)置 NO。

command+B編譯工程,大量爆紅.原因是這些類里沒(méi)有導(dǎo)入U(xiǎn)IKit框架,在每個(gè)類的.h文件里顯式導(dǎo)入U(xiǎn)IKit框架,在鼠標(biāo)指針處添加
#import <UIKit/UIkit.h>;
然后開(kāi)啟推動(dòng)

6.測(cè)試是否集成成功
首先,我們?nèi)キh(huán)信的后臺(tái)給我們的應(yīng)用添加一個(gè)用戶


接著我們要去appledate.m文件里添加?xùn)|西了,很重要一步,廢話不多說(shuō),直接貼出來(lái)需要配置的代碼,直接拿去用0.0,需要添加的東西我在注釋里注釋的很明白...

上面的幾個(gè)方法在appdelegate里是必須重寫的,不然會(huì)直接導(dǎo)致推送不成功.其中.需要重點(diǎn)說(shuō)明的是:
只有在應(yīng)用完全退出被殺掉的狀態(tài)下,才可以收到環(huán)信推送的通知;
如果要發(fā)送在線的通知,需要在messagesDidReceive方法里獲取到環(huán)信推送的消息之后給用戶發(fā)起一個(gè)本地通知,這個(gè)大家可以自己研究下.
通過(guò)設(shè)置emoptions.displayStyle = EMPushDisplayStyleSimpleBanner;(上面代碼有)可以設(shè)置有通知過(guò)來(lái)的時(shí)候的顯示方式,顯示一個(gè)提示或者顯示完整的消息.
測(cè)試消息:在應(yīng)用完全退出的情況下(使用在環(huán)信注冊(cè)的賬戶登錄一次,確認(rèn)登錄成功之后再完全退出),選中我們的用戶,點(diǎn)擊發(fā)送消息:


測(cè)試結(jié)果:

感謝支持 :如有不懂 可以加我qq ? ? ?573702745
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
//AppKey:注冊(cè)的AppKey,點(diǎn)擊"應(yīng)用概述"可以看到AppKey,粘貼過(guò)來(lái)就可以。
//apnsCertName:推送證書(shū)名,填寫你的開(kāi)發(fā)證書(shū)或者發(fā)布證書(shū)名,就是上傳到環(huán)信后臺(tái)的兩個(gè)中的一個(gè),什么環(huán)境下測(cè)試使用什么環(huán)境的證書(shū)。
EMOptions*options = [EMOptionsoptionsWithAppkey:@"xinyisheng2016#jiandanliaochat2017"];
options.apnsCertName=@"deleve";
[[EMClientsharedClient]initializeSDKWithOptions:options];
//登錄環(huán)信這里使用的是我剛才在環(huán)信后臺(tái)創(chuàng)建的賬戶名和密碼,使用這個(gè)賬戶登錄,到時(shí)候如果在后臺(tái)給客戶端發(fā)消息的話,就可以找到該用戶
[[EMClientsharedClient]loginWithUsername:@"15217636961"
password:@"123456"
completion:^(NSString*aUsername,EMError*aError) {
if(!aError) {
NSLog(@"環(huán)信登陸成功");
EMPushOptions*emoptions = [[EMClientsharedClient]pushOptions];
//設(shè)置有消息過(guò)來(lái)時(shí)的顯示方式:1.顯示收到一條消息2.顯示具體消息內(nèi)容.
//自己可以測(cè)試下
emoptions.displayStyle=EMPushDisplayStyleMessageSummary;
[[EMClientsharedClient]updatePushOptionsToServer];
}else{
NSLog(@"環(huán)信登陸失敗");
}
}];
/**
注冊(cè)APNS離線推送iOS8注冊(cè)APNS
*/
if([applicationrespondsToSelector:@selector(registerForRemoteNotifications)]) {
[applicationregisterForRemoteNotifications];
UIUserNotificationTypenotificationTypes =UIUserNotificationTypeBadge|
UIUserNotificationTypeSound|
UIUserNotificationTypeAlert;
UIUserNotificationSettings*settings = [UIUserNotificationSettingssettingsForTypes:notificationTypescategories:nil];
[applicationregisterUserNotificationSettings:settings];
}
else{
UIRemoteNotificationTypenotificationTypes =UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeSound|
UIRemoteNotificationTypeAlert;
[[UIApplicationsharedApplication]registerForRemoteNotificationTypes:notificationTypes];
}
//添加監(jiān)聽(tīng)在線推送消息
[[EMClientsharedClient].chatManageraddDelegate:selfdelegateQueue:nil];
returnYES;
}
//監(jiān)聽(tīng)環(huán)信在線推送消息
- (void)messagesDidReceive:(NSArray*)aMessages{
UIAlertView*alertView = [[UIAlertViewalloc]initWithTitle:@"提示"message:[NSStringstringWithFormat:@"%@",aMessages]delegate:nilcancelButtonTitle:@"取消"otherButtonTitles:@"確定",nil];
[alertViewshow];
//aMessages是一個(gè)對(duì)象,包含了發(fā)過(guò)來(lái)的所有信息,怎么提取想要的信息我會(huì)在后面貼出來(lái).
}
//將得到的deviceToken傳給SDK
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{
[[EMClientsharedClient]bindDeviceToken:deviceToken];
}
//注冊(cè)deviceToken失敗
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error{
NSLog(@"error -- %@",error);
}
// APP進(jìn)入后臺(tái)
- (void)applicationDidEnterBackground:(UIApplication*)application
{
[[EMClientsharedClient]applicationDidEnterBackground:application];
}
// APP將要從后臺(tái)返回
- (void)applicationWillEnterForeground:(UIApplication*)application
{
[[EMClientsharedClient]applicationWillEnterForeground:application];
}