即時消息 – 時信魔方教程
文:徐江威
時信魔方的即時消息通過 MessagingService 模組來操作。在 Cube 啟動之後使用 MessagingService 的 sendTo
、sendToContact
或者 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
事件,每個模組都有不同的事件,通過這些事件可以方便的進行數據管理和對程式進行數據更新。具體的事件可以查看各個客戶端的文檔:
[完]