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