Telegram
Telegram 作為一款風(fēng)靡全球的社交軟件,最大的特點(diǎn)就是信息加密不受監(jiān)管。中東炮火中的火箭手在用,香港 DU 場(chǎng) xi qian 的大佬也在用......這種安全私密、不受監(jiān)管的特點(diǎn)非常符合區(qū)塊鏈業(yè)務(wù)的需求,所以大部分區(qū)塊鏈軟件會(huì)基于 Telegram 做二次研發(fā)。當(dāng)然還有各種各樣有安全需求的業(yè)務(wù)會(huì)考慮在 Telegram 的基礎(chǔ)上做研發(fā)。
開(kāi)源
除了保證聊天的安全加密,Telegram 全平臺(tái)也是開(kāi)源的,包括 Server、iOS、Android 都可以在 Github 看到相應(yīng)的源碼。在 Telegram 后臺(tái)注冊(cè)一個(gè)賬號(hào),就可以開(kāi)始開(kāi)發(fā)工作了。本文主要談一下對(duì) Telegram 的 iOS 源碼的理解。
底層數(shù)據(jù)庫(kù)結(jié)構(gòu)
如下圖,通過(guò)底層數(shù)據(jù)庫(kù)結(jié)構(gòu),我們可以了解 Telegram 主要業(yè)務(wù)是:群聊、單聊(普通/私密)、聯(lián)系人、消息收發(fā)、媒體緩存等。
消息機(jī)制
Telegram 消息是通過(guò)長(zhǎng)鏈接收發(fā)的,做了非對(duì)稱加密處理,保證不會(huì)在傳輸過(guò)程中被劫持破解。服務(wù)器只做消息的轉(zhuǎn)發(fā),并不保存用戶的聊天信息。
iOS 端使用的 MTProto 協(xié)議進(jìn)行聊天加密,2.0 版本的協(xié)議如下:
消息接收的過(guò)程如下:
消息結(jié)構(gòu)
_uid:577499321
_contactId:1236149230
_flags:8
_phoneNumber:8613763203217
_phoneNumberHash:-673666323598709087
_firstName:pauley
_LastName:Haha
_photoUrlSmall:5_852733294_208097_6526069910252166177
_photoUrlBig:5_852733894_20823229_5128008587494466111
消息構(gòu)建
下面以文本消息為例,梳理下消息構(gòu)建流程。TGPreparedTextMessage 是準(zhǔn)備要發(fā)送的消息格式封裝類,生成需要的消息 ID 等信息。 然后轉(zhuǎn)換為 TGMessage 通過(guò) TCP 通道發(fā)送到 Server,同時(shí)寫入本地?cái)?shù)據(jù)庫(kù)并通過(guò) KVO 的方式更新聊天視圖。
TGPreparedTextMessage *preparedMessage = [[TGPreparedTextMessage alloc] initWithText:[NSString stringWithFormat:@"%d", i] replyMessage:nil disableLinkPreviews:NO parsedWebpage:nil entities:nil botContextResult:nil replyMarkup:nil];
if (preparedMessage.randomId == 0)
{
int64_t randomId = 0;
arc4random_buf(&randomId, sizeof(randomId));
preparedMessage.randomId = randomId;
}
if (preparedMessage.mid == 0)
preparedMessage.mid = [[TGDatabaseInstance() generateLocalMids:1][0] intValue];
preparedMessage.date = (int)[[TGTeleboxNetworking instance] approximateRemoteTime];
TGMessage *message = [preparedMessage message];
message.cid = [self peerId];
message.fromUid = 531399335;
message.toUid = 577499201;
message.date = 1531396567;
message.flags = 2;
[TGDatabaseInstance() transactionAddMessages:@[message] updateConversationDatas:@{} notifyAdded:true];
[ActionStageInstance() dispatchResource:[[NSString alloc] initWithFormat:@"/tg/conversation/(%lld)/messages", [self peerId]] resource:[[SGraphObjectNode alloc] initWithObject:@[message]]];
聊天 Cell 組建
高度組件化的聊天 Cell,通過(guò)一系列圖片、文本、按鈕、頭像、背景等基礎(chǔ)組建組裝。為了提高性能,視圖的渲染使用的 Core Grahics 框架繪制。所以如果需要自定義布局,需要在 layout 方法中 resize 視圖。整個(gè)聊天 Cell 的組建流程如下圖:
核心類和方法
- 處理接收消息類
MTRequestMessageService、TGUpdateMessageService
- 獲取 User
TGUser *databaseUser = [[TGDatabase instance] loadUser:(int)(it->first)];
- 消息數(shù)據(jù)構(gòu)建類:
TGPreparedTextMessage
- 數(shù)據(jù)庫(kù)寫入:
[TGDatabaseInstance() transactionAddMessages:@[message] updateConversationDatas:@{} notifyAdded:true];
- 數(shù)據(jù)更新:
[ActionStageInstance() dispatchResource:[[NSString alloc]
initWithFormat:@"/tg/conversation/(%@)/messages", [self _conversationIdPathComponent]] resource:[[SGraphObjectNode alloc] initWithObject:addToDatabaseMessages]];
相關(guān)鏈接
- Telegram 官網(wǎng):https://telegram.org
- Telegram API:https://core.telegram.org/api
- Telegram Bot API:https://core.telegram.org/bots/api
- Telegram iOS Source:https://github.com/peter-iakovlev/Telegram