環信推送詳解

最近一段時間工作量比較大, 抽不出時間來整理博客, 趁今天任務量較小的時候整理下關于環信推送的問題, 介紹. 集成以及常見的問題 , 這周末空的話我會寫個推送的demo和實時音視頻的demo出來
APNs證書創建和上傳到環信后臺 :http://www.imgeek.org/article/825308748
APNS離線推送文檔 : http://docs.easemob.com/im/300iosclientintegration/75apns
原文地址:http://www.imgeek.org/article/825308792

一. 離線推送

如果app集成時添加

- (void)applicationDidEnterBackground:(UIApplication *)application {
[[EMClient sharedClient] applicationDidEnterBackground:application];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
[[EMClient sharedClient] applicationWillEnterForeground:application];
}

App后臺靜默后,能夠保持長連接3分鐘左右。超過3分鐘,長連接會斷開,當前登錄的賬號,在服務端被認為離線。消息會存入離線消息空間,之后接收的消息會在再次登錄后,連接上服務器,然后通過長連接把消息取走,投遞給此用戶。如果app配置了推送證書,上傳了推送證書并且集成了推送功能,服務器會給接收方發一個APNs推送,則會對離線消息進行APNs推送提示消息內容,通知接收方有一條新消息。
如果想自定義推送的alert,可以在發消息的時候,在消息擴展中添加相應的字段。文檔見:http://docs.easemob.com/im/300iosclientintegration/apnscontent

所以這里推送說的是當app被殺死或者進入后臺三分鐘之后的離線推送
消息回調 :app在前臺及app進入后臺三分鐘之內

注意:環信支持推送消息,只是目前還不能根據標簽推送給特定用戶組,也暫不支持推送模板。CMD消息沒有推送,好友請求也沒有推送

收不到離線推送時可以從下面幾個方面找下原因

1.測試apns推送的時候,接受消息方的app是殺掉狀態嗎,或者進入后臺三分鐘以后
2.看看你環信后臺上傳的證書名稱與工程中初始化SDK那里填的證書名 是不是相同的
3.配置證書時候填的id與你工程中的bundle id 是否相同
4.devicetoken有沒有傳給環信SDK。即查看管理后臺中,對應 IM 賬戶下是否有您剛剛寫的證書名。(如果沒有,請檢查您是否得到了 deviceToken)
5.確認Xcode環境是否配置正確 ,Build Settings---signing,看Debug對應的是不是開發的,Release對應的是不是生產的
6.在確認xcode運行環境是否正確 (Product-->Scheme-->Edit Scheme, 開發證書選Debug,生產證書選Release)
7.證書制作上傳過程是否有問題,配置證書的時候是否設置了密碼,正確的步驟可以參考:http://www.imgeek.org/article/825308748。另外可以用推送工具進行驗證。
8.如果以上都沒有問題,可以嘗試重新制作上傳一下推送證書。
對照這些檢查一下,基本上就是這些原因

如果上面幾點都符合的話,看下重新登錄之后是否可以收到之前收不到推送消息
可以的,話提供一下AppKey,證書名 (查下證書是否被封)以及收不到的推送消息的消息id及發送方和接收方log
log導出請看這篇文章: http://www.imgeek.org/article/825308785 然后轉成txt格式上傳到工單上,環信這邊來查下消息推送記錄

注意 :后臺沒有證書名 是指用戶列表后面沒有顯示證書名。這個證書名是SDK初始化的時候傳的字符串,用戶登錄之后會進行綁定。
如果用戶沒有綁定證書名的話,肯定收不到推送的。這個證書名是用戶登錄之后綁定的,要確認下初始化SDK的時候有沒有傳。 options.apnsCertName = apnsCertName;

==============常見問題==============

Q : iOS apns離線推送證書apns的離線推送可以和友盟(極光)推送共用一個證書嗎?

A: 環信的推送只要和后臺上傳的證書對應就可以實現,其他的不關心。
首先蘋果推送證書的生成都是統一的方式,這個不區分是極光(友盟)推送證書還是個推證書等等。使用的推送證書只要按照正確的蘋果推送證書生成流程創建,都可以使用。
環信添加推送證書可以看http://www.imgeek.org/article/825308748,不是要求必須重新生成推送證書

Q : 好友申請通知的離線推送?

我們的好友體系,添加好友的申請不支持離線推送。
如果你們是使用App本身的好友體系,可以在app的添加好友業務上向被添加的好友發送文本消息,在EMMessage的ext中設置自定義字段,來區分此條文本消息是否用于好友申請提示,由此來判斷處理UI的顯示。

Q : iOS的殺死進程遠程推送和服務端有關么

A: 如果客戶端把遠程通知給關了肯定就收不到通知,我們服務器會檢測客戶端是否有deviceToken,有的話才會把消息發送到deviceToken對應的設備上

Q : 每個項目創建了一個開發的推送證書一個生產的推送證書。這倆證書什么時候要做切換?

在App上傳AppStore前需要修改App內初始化SDK設置的推送證書名,EMOptions的apnsCertName。
注意,這里的值需要和在Console管理后天上傳時設置的證書名一致。

Q : 綁定devicetoken的時候是否需要先登錄到環信?

綁定是需要登錄過之后才進行的,

 - (EMError *)bindDeviceToken:(NSData *)aDeviceToken; 是把deviceToken傳給SDK。調用登錄,SDK會進行綁定。也可以調用 - (void)registerForRemoteNotificationsWithDeviceToken:(NSData *)aDeviceToken

completion:(void (^)(EMError *aError))aCompletionBlock;自己綁定
需要判斷是否已經登錄,如果已經有登錄的賬號,再登錄會返回 已登錄的錯誤。

Q : 離線推送在客戶端怎么設置顯示詳情?
EMPushOptions *pushOptions = [[EMClient sharedClient] pushOptions];
pushOptions.displayStyle = EMPushDisplayStyleMessageSummary;

可以設置離線推送消息顯示具體內容還是只顯示-您收到一條消息
要設置在登錄成功之后,然后要用服務器拉取一遍APNS 屬性

EMError *error = nil;
EMPushOptions *options = [[EMClient sharedClient] getPushOptionsFromServerWithError:&error];

然后在修改displayStyle

Q : 兩個APP通信,如果只希望其中一類APP能收到推送,而另一端的APP不希望收到推送,是不是不希望收到推送的APP不配置證書就好了?

兩個App的推送證書都是在同一appkey下單獨配置的,如果不希望收到推送,可以對此App不配置推送證書,同時在App代碼中注釋掉注冊遠程通知的相關代碼。
bundle id對應的證書也可以取消push的功能,針對App不使用任何遠程推送服務,包括其他第三方的,如果App還需要其他第三方的推送服務,請忽略這句話。

Q : 不配置推送證書的APP是不是只有刷新的情況下才會顯示新的消息?不刷新的情況下APP是看不到新的消息?

不配置推送功能的App,只有在用戶登錄成功后,才能通過長連接的接收消息回掉中拿到消息體。

Q : 在開發環境下收到了離線推送消息,但是在生成環境下沒有收到?

看一下SDK初始化時,是否設置的apnsCerName與生產環境證書上傳時填寫的證書名一致,還有是否為adhoc打包成ipa文件安裝測試的。

Q :發送消息1,2,3,4,5 對方收到推送 2 1 5 順序不對而且丟失, app角標也不對

1.首先,蘋果不保證所有遠程推送的到達率。這個可以看蘋果官方文檔。
Because the delivery of remote notifications is not guaranteed, never include sensitive data or data that can be retrieved by other means in your payload.
2.我們只保證,把離線消息執行遠程推送,發給蘋果服務器。蘋果服務器是否能夠百分之百把所有推送送達到指定移動端,這個根據蘋果的策略,當 APNs 向你發送了多條推送,你的設備在 APNs 那里下線了,這時 APNs 到你的手機的鏈路上有多條任務堆積,APNs 的處理方式是,只保留最后一條消息推送給你,然后告知你推送數。那么其他消息會被APNs丟棄。
3.我們保證的是離線消息,當用戶重新登錄時,可以都接收到。

  1. 如果需要找后臺查詢離線消息(前提接收方已綁定deviceToken)是否成功,需要提供離線消息的messageId,接收方環信id
    5.我們的推送角標,是接收方的在服務端的離線消息數。
    https://developer.apple.com/library/prerelease/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1
    這是官方文檔
Q11 :ios是怎么判斷離線了 然后發推送的啊 有時候把應用殺掉后 半天收不到推送

rest可以查用戶的狀態,推送前提是此用戶有devicetoken已經綁定成功
如果賬號所有配置都沒問題,殺掉后,其他人發的消息,過幾秒就能看到推送

Q12 : Q11不管用會是啥原因呢

配置,還有賬號在我們這綁的deviceToken

Q : 多個app共用一個appkey 推送證書怎么配置呢

后臺可以上傳多套推送證書。

Q :程序關閉后推送了一個消息,點擊后怎樣獲取到環信傳過來的數據

需要用戶點擊橫幅后,重新啟動App,這時從- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中,獲取字典launchOptions,UIApplicationLaunchOptionsRemoteNotificationKey這個key下的數據,就是aps的字典數據

二 . 消息回調

app的長連接存在的時候,環信服務器檢測您為在線狀態,是不會給app推送消息的。app端在線的情況下,消息會通過長連接直接收取(didreceivemessage),收到消息,SDK會通過回調通知給上層。app通過收消息的回調拿到消息對象,然后解析并展示UI。
目前我們不支持App切后臺后,可以一直執行。
我們SDK在切后臺后,實現[[EMClient sharedClient] applicationDidEnterBackground:application];,會保持,直到被系統釋放
iOS目前其他方式應該都無法去實現一直保持App的活躍狀態了。
android 這邊后臺受到各種 rom 的限制,沒有固定的結果,有可能馬上就被殺死,有可能一直不被殺死,你可以嘗試下自己對自己的 app 進行后臺保活http://melove.net/blog/2017/03/android-daemon-service-1488942411000.html

==============常見問題==============

Q : 本地推送聲音設置在哪 ?一條消息推送兩聲

A: 推送聲音設置的要自己實現,具體可參考demo里的ChatDemoHelper類和MainViewController類里的

  • (void)showNotificationWithMessage:(EMMessage *)message方法,該方法中有發送本地推送做的一系列操作,本地通知怎么做的,本地通知觸發幾次,一條消息推送幾聲,一下接收到多條消息響幾聲,都需要用戶自己實現.
Q : 視頻通話,推送怎么實現?

iOS 3.2.3之后,如果在實時通話接收方不在線時,發送提醒。
1.在發起實時音視頻通話前,需要設置EMCallOptions對象屬性isSendPushIfOffline為YES;
2.遵守協議EMCallBuilderDelegate,實現其中的- (void)callRemoteOffline:(NSString *)aRemoteName 委托方法。
3.在第2步的方法中向 aRemoteName用戶發送單聊消息。
如果被叫方已注冊遠程通知且綁定deviceToken,會收到對應消息的APNs推送,點擊橫幅來喚醒App。

上面是接收方離線的情況。如果接收方長連接還未斷開,只是App切到后臺,需要在回調- (void)callDidReceive:(EMCallSession *)aSession中判斷當前App是否在后臺,如果是彈出本地通知。

EMCallOptions *options = [[EMClient sharedClient].callManager getCallOptions]; //

當對方不在線時,是否給對方發送離線消息和推送,并等待對方回應

options.isSendPushIfOffline = YES; [[EMClient sharedClient].callManager setCallOptions:options];

isSendPushIfOffline設置為YES后,A用戶呼叫B用戶,B用戶處于離線狀態,但B用戶沒有收到推送。
SDK版本是3.2.0

  1. 先確接收方殺掉App后,文本消息是否能收到APNs推送。
    2.在1點確認App殺掉可以收到推送前提下,確認實時音視頻發送方代碼執行順序如下:
(1) EMCallOptions *callOptions = [[EMClient sharedClient].callManager getCallOptions];
callOptions.isSendPushIfOffline = YES;
callOptions.offlineMessageText = @"提示文本";//可選
[[EMClient sharedClient].callManager setCallOptions:callOptions];

(2) callManager調用

- (void)startVideoCall:(NSString *)aUsername
completion:(void (^)(EMCallSession *aCallSession, EMError *aError))aCompletionBlock;

或者

- (void)startVoiceCall:(NSString *)aUsername
completion:(void (^)(EMCallSession *aCallSession, EMError *aError))aCompletionBlock;

Q : 推送的提示音可不可以自定義啊。
推送的提示音目前不支持自定義,本地通知的你們以自己去設置。

Q : app壓后臺,立刻收到聊天推送來的信息,點擊通知欄信息,捕獲不到喚起程序事件
App切后臺后,長連接為斷開前,當前彈出的橫幅是本地通知,那么此時喚醒時間是本地通知的回調

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

iOS10后

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler;
Q : 環信在離線狀態下能收消息,但是程序運行狀態按home按鍵進入后臺的時候無法接受消息,怎么處理

App切入后臺一段時間內,長連接還未斷開,這時候接收消息都是通過SDK的接收消息回調(EMChatManagerDelegate)來收消息,不會執行APNs推送。
如果是需要彈出橫幅提醒,需要在接收消息的回調方法中,判斷[[UIApplication sharedApplication] applicationState]為UIApplicationStateBackground,然后實現本地通知。可以參考demo中的處理

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容