【发布时间】:2018-01-04 09:49:16
【问题描述】:
我已经使用 pubnub 在 Ionic3 中实现了聊天。它适用于群聊。用于群聊的频道是“group1-ch”。我在这里添加了我的代码。我在开发一对一聊天时遇到了一些困难。
发布服务
import {Injectable, EventEmitter} from '@angular/core';
declare var PUBNUB;
type OnMessageFn = (message, envelope, channelOrGroup, time, channel) => void;
export enum PubNubEventType {
MESSAGE,
CONNECT,
DISCONNECT,
RECONNECT,
PUBLISHED,
HISTORY,
PRESENCE
}
export class PubNubEvent {
constructor(public type: PubNubEventType, channel:string, public value: any) {}
}
@Injectable()
export class PubNubService {
pubnub:any;
/**
* Call this method after platform becomes to be ready
*/
// init() {
constructor() {
}
connectionuuid(uuid){
this.pubnub = PUBNUB({
subscribe_key: '*********************************',
publish_key: '*********************************',
uuid:uuid,
ssl: true,
secret_key: '**************************************'
});
}
subscribe(channel:string):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.subscribe({
channel : channel,
withPresence: true,
presence : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PRESENCE, channel, message));
},
message : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.MESSAGE, channel, message));
},
connect: (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.CONNECT, channel, message));
},
disconnect: (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.DISCONNECT, channel, message));
},
reconnect: (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.RECONNECT, channel, message));
},
error: (error) => {
eventEmitter.error(error);
},
});
return eventEmitter;
}
publish(channel:string, message:any, store_in_history:boolean = true):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.publish({
channel: channel,
message: message,
store_in_history: store_in_history,
callback : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PUBLISHED, channel, message));
},
// Executes on a publish error.
error: (error) => {
eventEmitter.error(error);
}
});
return eventEmitter;
}
individual_chat(channel:string, message:any, store_in_history:boolean = true):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.publish({
channel: channel,
message: message,
store_in_history: store_in_history,
callback : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PUBLISHED, channel, message));
},
// Executes on a publish error.
error: (error) => {
eventEmitter.error(error);
}
});
return eventEmitter;
}
history(channel: string, count:number = 100, start:number = null, end:number = null, reverse:boolean = true, include_token: boolean = true):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.history({
channel: channel,
callback: (messages) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.HISTORY, channel, messages));
},
error: (error) => {
eventEmitter.error(error);
},
count: count,
start: start,
end: end,
reverse: reverse,
include_token: include_token
});
return eventEmitter;
}
here_now(channel: string, count:number = 100, start:number = null, end:number = null, reverse:boolean = true, include_token: boolean = true):EventEmitter<PubNubEvent>{
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.here_now({
channel: channel,
callback: (m) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PRESENCE, channel, m));
},
error: (error) => {
eventEmitter.error(error);
},
count: count,
start: start,
end: end,
reverse: reverse,
include_token: include_token
});
return eventEmitter;
}
where_now(channel: string, count:number = 100, start:number = null, end:number = null, reverse:boolean = true, include_token: boolean = true):EventEmitter<PubNubEvent>{
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.where_now({
uuid: channel,
callback: (m) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PRESENCE, channel, m));
},
error: (error) => {
eventEmitter.error(error);
},
count: count,
start: start,
end: end,
reverse: reverse,
include_token: include_token
});
return eventEmitter;
}
}
我的要求
- 谁能告诉我如何为一对一聊天创建“频道”?
- 接收方如何知道发送方正在使用哪个频道?
感谢和问候
阿南德·拉杰
【问题讨论】:
-
对这种情况有什么帮助吗?
-
这是关于在两个用户之间发起聊天的设计模式问题。从Chat Fundamentals 开始,并查看其他Design Patterns 以获得更强大的应用程序要求。还可以考虑PubNub ChatEngine,虽然它目前没有 Ionic 实现,但是还有其他框架选项。
-
虽然有一个 Angular 示例:github.com/pubnub/chat-engine#angular
-
@CraigConover 嗨,克雷格,感谢您的回复。假设我有(“Anand”)5 个用户(A、B、C、D、E)的列表,我想单独与每个用户聊天。所以我必须有5个不同的渠道,对吧?那么如何命名通道呢?如果我为用户 A 命名频道 AnandA,那么用户如何知道我正在通过频道“AnandA”与 A 聊天?
标签: angular ionic2 chat pubnub