即時訊息 - 時信魔方教程

時信魔方發表於2021-01-03

文:徐江威

時信魔方的即時訊息通過 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 事件,每個模組都有不同的事件,通過這些事件可以方便的進行資料管理和對程式進行資料更新。具體的事件可以檢視各個客戶端的文件:


 

[完]

相關文章