即時消息 – 時信魔方教程

文:徐江威

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


 

[完]