即時消息 - 時信魔方教程


文:徐江威

時信魔方的即時消息通過 MessagingService 模塊來操作。在 Cube 啟動之后使用 MessagingService 的 sendTosendToContact 或者 sendToGroup 向指定的聯系人或群組發送消息。通過加入事件監聽器來接收 MessagingService 的事件,從而實現接收來自其他聯系人或者群組的消息。

啟動 Cube Engine

一般實例化 Cube Engine 之后,通過配置相關的域參數即可啟動 Cube 。

Cube 支持多域管理,因此每個客戶端設備啟動 Cube 時都需要標記自己所在的域信息,這些信息包括 Cube 的網關機地址、域信息和 App Key 等。例如:

{
    "address": "127.0.0.1",
    "domain": "shixincube.com",
    "appKey": "shixin-cubeteam-opensource-appkey"
}

這個 JSON 表示的配置信息就包括服務器的地址 address ,所在域的名稱 domain,以及這個域里的 appKey 識別串。

各個客戶端的啟動代碼如下:

Web 版

const cube = window.cube();

const config = { "address": "127.0.0.1", "domain": ... };

cube.start(config, function() {
    console.log('Cube 啟動成功');
}, function() {
    console.log('Cube 啟動錯誤');
});

Android 版

KernelConfig config = new KernelConfig();
config.address = "127.0.0.1";
config.domain = "shixincube.com";
config.appKey = "shixin-cubeteam-opensource-appkey";

CubeEngine.getInstance().start(context, config);

iOS 版

CKernelConfig *config = [[CKernelConfig alloc] init];
config.domain = @"shixincube.com";
config.appKey = @"shixin-cubeteam-opensource-appkey";
config.address = @"192.168.1.113";
[[CEngine shareEngine] startWithConfig:config];

賬號簽入

成功啟動 Cube 之后,就需要為終端指定賬號了,以便告訴服務器“我是誰”。

Cube 的賬號由 ContactService 模塊管理,一般來說,使用 Cube 不需要預先進行“賬號注冊”,也就是說應用程序可以指定任意一個 long 型 ID 為賬號的 ID ,無需先進行這個 ID 的注冊和添加,這樣可以方便應用程序快速綁定一個賬號到 Cube 。

例如如果應用程序當前登錄的賬號 ID 是 102030405,那么可以直接將 Cube 的簽入聯系人 ID 設置為 102030405 ,實現 Cube ID 和應用程序賬號一致,以便管理。

簽入聯系示例代碼如下:

Web 版

let accountId = 102030405;
let accountName = 'MyApp用戶的顯示名';

cube.signIn(accountId, accountName);

Android 版

long accountId = 102030405;
String accountName = 'MyApp用戶的顯示名';

CubeEngine.getInstance().getService(ContactService.class).signIn(accountId, accountName, new CubeCallback<Contact>() {
    @Override
    public void onSuccess(Contact result) {
        Toast.makeText(MainActivity.this, "賬號設置成功", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onFailure(int code, String desc) {
    }
});

iOS 版

// 簽入賬號
[[CEngine shareEngine] signIn:@"102030405" name:@"MyApp用戶的顯示名"];

發送消息

簽入賬號之后即可向指定的賬號發送消息。直接將實例化的 Message 對象通過 MessagingService 模塊發送給指定用戶。

Web 版

// 實例化消息
let message = new Message({ "content": "這里是我想說的話!" });

// 發送給 ID 為 908070605 的聯系人
cube.messaging.sendToContact(908070605, message);

Android 版

JSONObject payload = new JSONObject();
payload.put("content", "這里是我想說的話!");
Message message = new Message(payload);

// 獲取消息服務
MessagingService messaging = CubeEngine.getInstance().getService(MessagingService.class);
// 發送給 ID 為 908070605 的聯系人
messaging.sendToContact(908070605L, message, new CubeCallback<Message>() {
    @Override
    public void onSuccess(Message result) {
        Toast.makeText(MainActivity.this,
            "發送消息:" + message.getPayload(),
            Toast.LENGTH_LONG).show();
    }

    @Override
    public void onFailure(int code, String desc) {
        Toast.makeText(MainActivity.this,
            "發送失敗:" + desc,
            Toast.LENGTH_LONG).show();
    }
});

iOS 版

// 獲取消息傳輸服務
CMessagingService *messaging = (CMessagingService *)[[CKernel shareKernel] getModule:CMessagingService.mName];

// 實例化消息
CMessage *message = [[CMessage alloc] initWithPayload:@{@"content":content}];

// 發送給指定聯系人
[messaging sendToContact:908070605L message:message];

至此,我們就通過短短的幾行代碼就完成了即時消息的發送。

監聽消息事件

如何接收來自其他人發送的消息呢?

Cube 通過回調監聽器方法的方式來進行事件通知,包括接收到新消息、消息是否已經成功發送等事件。向 MessagingService 模塊添加監聽 Notify 事件的監聽器或函數來接收消息:

Web 版

// 監聽 Notify 事件
cube.messaging.on(MessagingEvent.Notify, onNotify);

function onNotify(event) {
    let message = event.getData();
    console.log('接收到來自:' + message.getFrom() + ' 的消息');
}

Android 版

class MyMessageListener implements MessagingListener {
    @Override
    public void onNotify(Message message) {
        Toast.makeText(MainActivity.this,
            "收到消息:" + message.getPayload(),
            Toast.LENGTH_LONG).show();
    }
}

iOS 版

// 監聽 Notify 事件
[[CEngine shareEngine].messagingService attach:self];

// 主要事件
-(void)update:(CObserverState *)state{
    if ([state.name isEqualToString:MessagingEvent::Notify]) {
        NSLog(@"recv message ...");
    }
}

除了 Notify 事件,每個模塊都有不同的事件,通過這些事件可以方便的進行數據管理和對程序進行數據更新。具體的事件可以查看各個客戶端的文檔:


 

[完]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM