最近項(xiàng)目需求,然后就要接im,因?yàn)轫?xiàng)目是swfit的,然后很多坑都要自己踩,自己填,然后就遇到很多坑,然后看了好幾家的im,就先討論一下im的坑,有騰訊,阿里,融云,然后順便看了leanclound的文檔,
先說一下im的大致流程,一般都是初始化sdk,然后注冊,登錄,監(jiān)聽會話,收發(fā)消息,退出登錄
然后這我只接了前三家,這里面最難接的是騰訊的,文檔也看的頭疼,最好接的是融云,就幾句代碼就搞定了,阿里百川的文檔感覺就是純粹是為了寫文檔而寫的文檔,感覺就只有個(gè)簡化版的文檔,
現(xiàn)在就先說說騰訊,騰訊真的是接的頭大,坑很多,而且官方的demo也寫的很亂,他們的框架有登錄注冊的一體化界面,但是沒有會話列表和會話界面,所以如果要寫的話就要自己監(jiān)聽會話,解析會話列表,解析會話,也有可能是因?yàn)槲覀冺?xiàng)目是swift的,所以也用不了他的demo上的代碼。oc的項(xiàng)目可能會好接一點(diǎn),但是對于swift的來說,真的是很難接的,
然后我接的第二個(gè)是融云的,很方便,對于swift的來說,下面是我寫的融云的demo視圖控制器里面的代碼
import UIKit
var strMsg:String = ""
class ViewController: RCConversationListViewController{
override func viewDidLoad() {
super.viewDidLoad()
initSdk()
loginRCIM()
self.setDisplayConversationTypes([RCConversationType.ConversationType_PRIVATE.rawValue, RCConversationType.ConversationType_GROUP.rawValue,RCConversationType.ConversationType_DISCUSSION.rawValue])
// Do any additional setup after loading the view, typically from a nib.
}
func initSdk(){
RCIM.shared().initWithAppKey("你自己的appkey")
}
func loginRCIM(){
//v0tbKdy6d56FLTz70/NuUv83QwmF6X8F1GOlJSqqcbOwmWMGcNoJFZQM4zwOUo4Hb6OachOiHkXSKwII6Z3pxA==
RCIM.shared().connect(withToken: "(這個(gè)token是調(diào)用融云的后臺服務(wù)器利用userid,username,用戶頭像,生成的token,如果是自己用的話,可以調(diào)自己的后臺訪問融云,然后返回到前端)", success: { (userId) in
print("\(userId!)")
}, error: { (err_code) in
print("\(err_code)")
}) {
print("token wrong")
}
}
override func onSelectedTableRow(_ conversationModelType: RCConversationModelType, conversationModel model: RCConversationModel!, at indexPath: IndexPath!) {
let conversationVC = RCConversationViewController()
conversationVC.conversationType = model.conversationType
conversationVC.targetId = model.targetId
conversationVC.title = "message"
self.navigationController?.pushViewController(conversationVC, animated: true)
}
}
這里就要說生成會話列表之后的點(diǎn)擊事件,因?yàn)闀捔斜淼母割惗际莟ableview,然后騰訊和融云都是直接把點(diǎn)擊的那個(gè)didselectrowat這個(gè)方法暴露或者可以重寫的,你要添加點(diǎn)擊事件或者生成會話界面就直接在這里面實(shí)現(xiàn)就可以了,融云的坑還好吧,我用swift接的時(shí)候,沒咋發(fā)現(xiàn)有什么坑,
然后要說最好一個(gè)阿里百川的了,我接的時(shí)候有兩個(gè)問題,一個(gè)是會話列表不出來,一個(gè)是點(diǎn)擊了之后沒反應(yīng),阿里百川的接入方式和融云,騰訊都不一樣,然后和leanclound是差不多的,然后阿里的那個(gè)技術(shù)論壇基本是沒人的,然后后面老大吧我拉了一個(gè)釘釘?shù)娜汉退麄兡沁叺娜私涣鳎蝗f項(xiàng)目是swift的,那邊找了個(gè)技術(shù)人員是不懂swift的,然后問了一些問題基本都沒解決的,后來還是在靠的我自己解決的,先說會話列表的問題,最開始的時(shí)候,我的會話界面是用的viewcontroller自己的導(dǎo)航控制區(qū)push的,然后沒東西出來,也不知道什么問題,然后后面我用present方式,然后就出來了。第二個(gè)問題是點(diǎn)擊的,就這個(gè)東西卡了我2天吧,周五到周一,周末沒想過這些問題,阿里的tableview的點(diǎn)擊事件沒有暴露出來,然后我也不能重寫,是通過block的方式實(shí)現(xiàn)的,我這邊要實(shí)現(xiàn)點(diǎn)擊就只能給這個(gè)block賦值,我之前賦值的時(shí)候是塊不對,swift的閉包和oc有區(qū)別,swift自己能識別類型,在傳值的時(shí)候就不用定義類型,然后里面塊寫完之后也不用as!轉(zhuǎn)成他的YWConversationsListDidSelectItemBlock,我之前是寫了轉(zhuǎn)換,所以里面的代碼跑不了,然后這是一個(gè),還有一個(gè)坑是,阿里的界面都是基于uinavigationcontroller進(jìn)行跳轉(zhuǎn)的,我之前是這么跳轉(zhuǎn)的,然后就開始崩潰,說我的一個(gè)array里面的值是nil,我在想哪里有array?
SPKitExample.sharedInstance().exampleOpenConversationViewController(with: aConversation, from: nil)
然后我后面看控制器的崩潰代碼里面說了一個(gè)導(dǎo)航欄控制器的那個(gè)array里面沒東西,所以跳轉(zhuǎn)的時(shí)候他就找不到東西,后面我就機(jī)制的自己定義了一個(gè)導(dǎo)航欄控制器,然后在那個(gè)控制器里面添加會話列表界面,然后跳轉(zhuǎn)的時(shí)候后面的from就寫成self了,然后就解決了困惑我兩天的東西,基本就這些吧,demo寫的太粗糙就不上傳了,有什么問題的話聯(lián)系我就可以了,我們一起填坑