浅谈互联网经济平台品牌建设

简介

由去年 LeanCloud
发布实时通信(IM)服务后,基于用户举报和工程师对需要的消化与对业务的提炼,上周标准颁发了「实时通信
2.0
」。设计意见一如既往是「灵活、解耦、可构成、可定制」,具体可参见《实时通信支出指南》,了解
LeanCloud 实时通信的基本概念和模型。

多多丁张口闭口发话品牌,要被“品牌”一个精准的概念,这即于广大口讨厌了。个人于认可Interbrand公司对品牌之概念:“品牌是顾客在具有的品牌接触点(店铺,电视,杂志,网络,企业员工齐)产生的一致种体验的总和。”

下载和设置

可以到 LeanCloud
官方下载点下载
LeanCloud IM SDK v2 本子。将下充斥及的 jar 包加入工程即可。

知名度、美誉度、认知度、联想度和忠诚度一般让当作品牌之五桩基金,所有的品牌工作也都围绕五件目标进行。互联网金融平台品牌建设,在履行层面,品牌建设只是由品牌计划、品牌因素导入、品牌公关(品牌打造)和品牌广告(品牌维护)四者下手。

相当底文书聊天

咱俩先行由极度简单易行的环入手,看看怎么用 LeanCloud IM SDK v2
兑现一对一文本摆龙门阵。

平等、品牌计划

品牌设计要根据市场营销战略制定,笔者在《互金企业市场营销战略统筹之五单步骤》一温软被,对互联网经济公司市场战略设计方式做了介绍,品牌计划则只是打以下三上面下手。

(一)品牌名称

品牌称号必须以独特性、简单易记、有故事、无歧义这些规范,好之品牌名能促进品牌的鼓吹拓宽。反面案例,例如:“穗金所、房金所、票金所、e金所、友金所、前金所、楚金所、微金所、汇金所、贷金所……“,品牌叫缺乏独特性,不便于记忆,常叫理财用户混淆。

(二)品牌一贯

品牌一贯是店对地下的买主进行营销规划,创立品牌于秘密顾客心目中之某种形象还是个性特征,从而得到竞争优势。定位的真面目就是是下消费者的“心智”,获得消费者心理及的承认,互联网经济品牌常用之定点法发出以下四种。

1、根据产品特性和功能定位

一个初的品牌应强调平等种特性,根据产品我的性质和经被客户拉动的实在好处固化。如网贷之寒定点“你身边的网贷之家”,众筹超市定位“专业的众筹导购平台”。

2、根据品牌之市场地位稳

依品牌的商海地位稳,在操作规模来个别栽政策可选用:
一凡“首席定位”策略,力求使品牌成为以业中的决策者或第一品牌。如众筹中国一贯“最具影响力的众筹资讯门户”。二凡“加强定位”策略,即注重巩固和提高自己以市场以及买主心目中幸存的位置。

3、根据品牌的USP定位

依据品牌为消费者提供的功利固化,并且这等同利益点是另外品牌无法提供的,是绝无仅有之。运用USP定位,在同类品牌过多、竞争可以的图景下,可以突出品牌之性状及优势。

4、根据品牌客户类型定位

依据品牌客户定位,是因目标客户之年龄、性别、身份、地理位置、行为偏好、规模、性质等也坐标的原则性法。

(1)根据个体客户类型定位:

譬如说,以个体客户的年龄为一定坐标,网筹金融,一寒顾服务80晚底经济理财平台;

(2)根据部门客户类型:

譬如说,以机关客户所于行业为稳坐标,珠宝贷,一小顾让珠宝行业投融资的服务平台;麻布袋,一寒顾于农业领域的P2P网贷平台。

(三)目标客户定位

明明的对象客户定位,有助于迅速地起消费者和品牌中的联系,从而“对号落座”,企业之品牌也克高效地被目标客户人群所领。

1、定位目标客户群体

相似照年龄,性别,出生日期,收入,职业,居住地,兴趣爱好,性格特征等维度来定义目标客户群体。

2、目标客户画像

根据目标客户定位,围绕目标客户特征,建立客户角色卡。以某p2p网筹资品牌吧条例,建立一个客户角色卡:张三,28夏,互联网公司营业经理,年薪20万,10万头盈余可用以网贷理财,居住地都,熟悉互联网以及理财。

初始化

及 LeanCloud 其他服务均等,实时聊天服务的初始化也是于 Application 的
onCreate 方法被进行的:

public class MyApplication extends Application{

    public void onCreate(){
      ...
      AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
      ...
    }
}

以于AndroidManifest.xml中间声明:

<manifest>
   ...

   <application
        android:name=".MyApplication"
        ....>
        ...

        <service android:name="com.avos.avoscloud.PushService" />

        <receiver android:name="com.avos.avoscloud.AVBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
        ...
   </application>

</manifest>

联网下我们用形成用户登录。

次、品牌因素导入

整体的品牌因素而参考CIS理论,一个品牌的识别系统包括:视觉识别、理念识别与作为识别。本文仅由品牌视觉形象和品牌焕发内涵两上面做简单阐述。

(一)完善品牌视觉形象

1、品牌logo

品牌符号化是极度简易直接的传播方式。品牌标志化能帮助顾客简化他们本着品牌之判断,对于企业而言,是降低沟通成本的有效途径。大红鹰的“V”代表在赢,可口可乐的“红色”代表正在活力。人们看一个“红钩”就会见想到耐克,看到大妈的“M”就见面想到麦当劳,看到“四个圈”就会见想到奥迪汽车。

2、色彩计划:

Hellokitty的主题颜色吗粉色,立顿茶叶之主题色为香艳,黑莓手机的主题色为黑色。他们还出死清楚的色彩定位。于互联网经济平台而言,色彩设计不仅关涉品牌形象,也直影响了网站及APP的菲菲和用户体验。

3、吉祥物

品牌吉祥物能够从至传递经营理念、增加品牌无形资产积累的图。为大家熟知的吉祥物:百度的度熊,腾讯的企鹅,天猫的黑猫,京东之金属狗,搜狐的狐狸,UC浏览器的松鼠,迅雷的蜂鸟。在互联网金融行业,付融宝的阿法狗,点融网的触及小融,小牛在线的有点牛犇犇,也还可圈可点。

(二)注入品牌内涵

1、品牌焕发

可口可乐能够风靡世界,卖的不是货物,卖的是同栽知识,是同样种植美国旺盛。朵唯将团结的品牌概念也女性手机,鼓励女性在成长的中途勇敢去品味新物。这些品牌焕发满足了消费者情感、心理层面的用,成为品牌营销及组织的要紧因素。同理,如果我们好被互联网经济平台注入品牌精神,与客户上情感与思维层面的关系,就显尤为重要。2016年3月,宜人贷赞助了无锡2016年马拉松赛,宜人贷选择赞助马拉松,既是针对性市场的精确把握,更是对老精神的认同。

2、品牌故事

品牌故事之素材可以来产品、创始人、公司、员工或独立用户。雕爷牛腩花500万购置秘方,西少爷肉夹馍创始人的悲愤爱情故事,褚橙褚时健的涨跌人生,阿里上市快递员敲钟。在互金行业,团贷网创始人唐军用213万人民币拍下史玉柱三钟头午餐时间,这些还是品牌故事。当然,品牌故事太紧要的使命是传递品牌焕发。

3、品牌slogan

Slogan对消费者之意思在于那所传递的商店之活理念,它所强调的是平寒店铺跟其的成品极突出的风味。互联网经济品牌应怎样撰写slogan,笔者于《行业就从未有过不土之Slogan吗?》一温和遭遇总结了金融品牌slogan创作之七不行套路:Slogan发出行动指令、Slogan给予效能应、Slogan突出品牌定位、在Slogan中崛起独特卖点、通过Slogan唤起情感共鸣、通过Slogan传递对目标受众的眷顾、通过Slogan传递品牌观。

登录

一经聊天发起方名叫 Tom,为直观起见,我们应用用户名来作为 clientId
登录聊天系统(LeanCloud 云端只要求 clientId
在利用内唯一即可,具体用什么数据由应用层决定),代码如下:

AVIMClient imClient = AVIMClient.getInstance("Tom");
imClient.open(new IMClientCallback(){
  @Override
  public void done(AVIMClient client, AVException e) {
    if (null != e) {
      // 出错了,可能是网络问题无法连接 LeanCloud 云端,请检查网络之后重试。
      // 此时聊天服务不可用。
      e.printStackTrace();
    } else {
      // 成功登录,可以开始进行聊天了(假设为 MainActivity)。
      Intent intent = new Intent(currentActivity, MainActivity.class);
      currentActivity.startActivity(intent);
    };
  }
});

老三、品牌公关(品牌培训)

阿尔·里斯看:品牌广告的重要性对象是品牌维护,品牌公关的严重性对象是品牌塑造。公关是通过媒体联系进行品牌传播,以获得民众关切及咀嚼。

互联网经济平台应当怎么样进展公关工作,参见笔者的旁一样篇稿子《盘点互联网经济品牌公关的常用手法》,这首文章对互联网金融品牌公关有较详细的总暨汇总。建设型公关如上线庆典、上线发布会、融资发布会;社会型公关如公益活动和买卖赞助;交际型公关如丝下考察、投资人见面会、政府走访调研;服务型公关如周网站体验、提升客服工作质量、提升平台透明度、确保平台安全可靠;宣传型公关包括对内宣传与对外宣传,对外做广告之款式要:媒体报道、媒体采访、事件公关、媒体合作、软文作和传媒见面会;维系型公关如借势合作伙伴、借势行业组织、借势论坛会议、借势名人效应和借势奖项荣誉;防御型公关如风险预警机制的建;进攻型公关如互金行业污名化背景下之正名之战、矫正型公关即危机公关。

树对话

假设我们只要同「Bob」这个用户进行拉,我们先行创造一个对话,代码如下:

List<String> clientIds = new ArrayList<String>();
clientIds.add("Tom");
clientIds.add("Bob");

// 我们给对话增加一个自定义属性 type,表示单聊还是群聊
// 常量定义:
// int ConversationType_OneOne = 0; // 两个人之间的单聊
// int ConversationType_Group = 1;  // 多人之间的群聊
Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_OneOne);

imClient.createConversation(clientIds, attr, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了,这时候可以显示对话的 Activity 页面(假定为 ChatActivity)了。
      Intent intent = new Intent(this, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      startActivity(intent);
    }
  }
});

立之「对话」在控制台怎么查

若你所见,我们创建一个会话的时候,指定了成员(Tom 和
Bob)和一个附加的性质({type: 0})。这些数据保存及云端后,你当
控制台 -> 存储 -> 数据 里面会相,_Conversation
表中益了同样漫漫记下,新记录之 m 属性值为["Tom", "Bob"]attr
属性值为{"type":0}。如您所预期,m 属性就是对准诺着成员列表,attr
属性就是用户增加的额外属性值(以目标的花样储存)。

季、品牌广告(品牌维护)

广告是经过市广告位让品牌宣传直接到达消费群体。品牌广告而概括分为线下品牌广告和线达品牌广告。

(一)线下品牌广告

1、分众广告

分众广告是应用技术手段让信息上目标受众的平栽广告模式。广告渠道而:分众传媒、巴士在线。分众传媒的写字楼广告,就能够挺好之掩盖白领群体,而白领群体又是互联网理财的精准客户。

2、交通器(站点、沿线)广告

广告渠道而:公交广告、地铁广告、高铁广告、机场广告、火车站广告、高速路牌广告、城市道路路牌广告等。以地铁广告为条例,地铁广告有覆盖面广、记忆点较好之长,也是P2P网贷平台最偏好的线下投放渠道有。地铁广告投放的主要形式有车厢广告、车厢拉手广告、隧道灯箱广告、站台语音广告等。通过是渠道投放的阳台包括人们贷、你自贷、信而富等20贱阳台。

3、纸质媒体广告

广告渠道而:报纸(如南方周末、南方城市报等)、杂志(汽车、财经、旅游等个杂志),广告形式诸如:专题报道、人物专访、内容营销合作暨另硬广。2016年5月,互联网金融平台点融网包下新京报等报刊头版打起正名宣言:“真的,不跑路”,利用纸质媒体之影响力,将团结放在聚光灯下,接受社会各方的审视,主动寻求和顾客对话。

4、电影院线广告

观影人群要为青春白领和学习者,15~30寒暑多,大部分观众深受了十全十美的教育,消费能力呢大,更容易接受P2P这同一新生消费形式和理财方式。宜信财富、天弘基金、信和财富与人们投等都下过院线广告,这些商家之投区域核心以北、上、广、深等同样丝城市为主。

5、广场液晶屏广告

除外用国内液晶屏广告资源,互联网金融公司还管视线投向海外,玩自“出口转内”的伎俩,2016年新年间,美国纽约时代广场刊登了国内100寒庄邀请世界国民一起过新年底宣扬内容,其中便包括易贷网在内的境内7贱互金平台。

6、楼宇广告

排放楼宇广告的阳台若团贷网、宜人贷、你本身贷等。但楼广告主要汇集在一如既往、二线城市,尤其以北上广深一线城市为主,并且内容形式较单一,播放监测困难,成本比高。

(二)线上品牌广告

1、T类展示广告

广告渠道而:腾讯网、新浪、网易、凤凰、APP开屏广告、互联网经济门户网站等。

2、电台广告

广告渠道而:传统电台(深圳广播电台、交通音乐电台相当)、互联网电台(喜马拉雅、荔枝FM等),比如,有车贷产品的P2P网贷平台比较合适当电台投放广告,尤其是直通广播电台,覆盖有车一样族。

3、电视广告

广告形式要:硬广、访谈、独家赞助、公益植入等。利用电视这种“权威”媒体也品牌背书,增信效果较明显(效果完全呈下降势头),但价格不菲,2014年9月1日起,信和财物在央视一仿照天气预报播报中插播“信与财物说话算数”的宣扬广告,后而陆续登陆江苏卫视、浙江卫视、东方卫视等地方卫视频道进行宣传拓宽,据估算,此轮宣传广告费上数千万人民币。

4、视频广告

广告渠道而:优酷、爱奇艺等;广告形式而:贴片广告、暂停广告、开机广告等。

另外,流量广告投放(SEM、网盟、DSP、导航等)、跨界合作、线达动、线下地推向、自媒体运营、社会化营销等营销方法,也是品牌建设之有效途径,但无是品牌建设的首要路径,他们又看重流量获取或用户运营,笔者将以“流量获取”“用户运营”专题开展详尽介绍。

出殡信息

树好对话后,要发送信息是老粗略的:

AVIMMessage message = new AVIMMessage();
message.setContent("hello");
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("发送成功,msgId=" + message.getMessageId());
    }
  }
});

吓了,这样同样漫漫消息就发送过去了。但是问题来了,对于「Bob」而言,他怎么才能够接到别人发给他的消息啊?

信接收

以 Bob 这无异端,要能接受到消息,需要如下几步:

1,进行初始化;

2,实现团结之 AVIMMessageHandler,响应新信息到达通知,主要是之类函数:

public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client);

对 Tom 发过来的消息,要展示出来,我们才需要兑现 onMessage
即可,示例代码如下:

class CustomMessageHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 新消息到来了。在这里增加你自己的处理代码。
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }
}

3,进行登录,代码也跟发送端一样。

完代码如下:

// 自定义消息响应类
class CustomMessageHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 新消息到来了。在这里增加你自己的处理代码。
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }
}

// application 的初始化部分
public void onCreate(){
  ...
  AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
  AVIMMessageManager.registerDefaultMessageHandler(new CustomMessageHandler());
  ...
}

// 用户登录部分
AVIMClient imClient = AVIMClient.getInstance("Bob");
imClient.open(new IMClientCallback(){
  @Override
  public void done(AVIMClient client, AVException e) {
    if (null != e) {
      // 出错了,可能是网络问题无法连接 LeanCloud 云端,请检查网络之后重试。
      // 此时聊天服务不可用。
      e.printStackTrace();
    } else {
      // 成功登录,可以开始进行聊天了。
    };
  }
});

注意!
AVIMMessageManager.registerDefaultMessageHandler() 一定要于
AVIMClient.open() 之前调用,否则恐怕导致服务器发回去的一对信息丢失。

几独重要的回调接口

从点的事例中可以看出,要收到及人家叫您发送的信息,需要重载
AVIMMessageHandler 类。从 v2 版开始,LeanCloud IM SDK
大量用到回调来报告操作结果,但是对有些被动之消息通知,则要用接口来落实的,包括:

  • 脚下网络出现转移
  • 对话中生出新的音讯
  • 对话中起新成员加入
  • 对话中来成员离开
  • 深受特邀在某对话
  • 被踹来对话

LeanCloud IM SDK 内部用了三种植接口来响应这些事件。

纱事件响应接口

最主要用于处理网络生成事件,接口定义在
AVIMClientEventHandler,主要函数为:

  /**
   * 实现本方法以处理网络断开事件
   */
  public abstract void onConnectionPaused(AVIMClient client);

  /**
   * 实现本方法以处理网络恢复事件
   */
  public abstract void onConnectionResume(AVIMClient client);

当网中断的景况下,所有的音信收发和对话操作都见面产出问题。

通过 AVIMClient.setClientEventHandler(AVIMClientEventHandler handler)
可以设定全局的 ClientEventHandler。

对话成员变动响应接口

关键用于处理对话中成员变动之事件,接口定义在
AVIMConversationEventHandler,主要函数为:

  /**
   * 实现本方法以处理聊天对话中的参与者离开事件
   *
   * @param members 离开的参与者
   * @param kickedBy 踢人者,自愿退出的情况下踢人者就是参与者
   */
  public abstract void onMemberLeft(AVIMClient client,
      AVIMConversation conversation, List<String> members, String kickedBy);

  /**
   * 实现本方法以处理聊天对话中的参与者加入事件
   *
   * @param members 加入的参与者
   * @param invitedBy 邀请人,有可能是加入的参与者本身
   */
  public abstract void onMemberJoined(AVIMClient client,
      AVIMConversation conversation, List<String> members, String invitedBy);

  /**
   * 实现本方法来处理当前用户被踢出某个聊天对话事件
   *
   * @param kickedBy 踢出你的人
   */
  public abstract void onKicked(AVIMClient client, AVIMConversation conversation,
      String kickedBy);

  /**
   * 实现本方法来处理当前用户被邀请到某个聊天对话事件
   *
   * @param conversation 被邀请的聊天对话
   * @param operator 邀请你的人
   */
  public abstract void onInvited(AVIMClient client, AVIMConversation conversation,
      String operator);

通过
AVIMMessageManager.setConversationEventHandler(AVIMConversationEventHandler handler)
可以设置全局的 ConversationEventHandler。

信应接口

重要用来处理新信息到达事件,接口定义在
MessageHandlerAVIMMessageHandler
是一个拖欠的兑现类似,我们相应通过重载 AVIMMessageHandler
的相干措施来好信息处理。主要的方法发生:

  // 收到新的消息
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation);

  // 自己发送的消息已经被对方接收
  @Override
  public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client);

通过 AVIMMessageManager.registerDefaultMessageHandler(handler)
可以设置全局的 MessageHandler。

俺们实现即时三好像接口,就可拍卖所有的通告消息了。示例代码如下:

class CustomNetworkHandler extends AVIMClientEventHandler {
  @Override
  public void onConnectionPaused(AVIMClient client) {
    // 请按自己需求改写
    Logger.d("connect paused");
  }

  @Override
  public void onConnectionResume(AVIMClient client) {
    // 请按自己需求改写
    Logger.d("connect resume");
  }
}

class CustomConversationHandler extends AVIMConversationEventHandler {
  public private Context gContext = null;
  private void toast(String str) {
    Toast.makeText(gContext, str, Toast.LENGTH_SHORT).show();
  }
  private void toast(Context context, String str) {
    Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onMemberLeft(AVIMClient client, AVIMConversation conversation, List<String> members, String kickedBy) {
    // 请按自己需求改写
    toast(MsgUtils.nameByUserIds(members) + " left, kicked by " + MsgUtils.nameByUserId(kickedBy));
    //注:MsgUtils 是一个辅助类,nameByUserIds 用来将 userId 转换成用户名
  }

  @Override
  public void onMemberJoined(AVIMClient client, AVIMConversation conversation, List<String> members, String invitedBy) {
    // 请按自己需求改写
    toast(MsgUtils.nameByUserIds(members) + " joined , invited by " + MsgUtils.nameByUserId(invitedBy));
    //注:MsgUtils 是一个辅助类,nameByUserIds 用来将 userId 转换成用户名
  }

  @Override
  public void onKicked(AVIMClient client, AVIMConversation conversation, String kickedBy) {
    // 请按自己需求改写
    toast("you are kicked by " + MsgUtils.nameByUserId(kickedBy));
  }

  @Override
  public void onInvited(AVIMClient client, AVIMConversation conversation, String operator) {
    // 请按自己需求改写
    toast("you are invited by " + MsgUtils.nameByUserId(operator));
  }
};

class CustomMsgHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }

  @Override
  public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    Logger.d("发往对话 " + conversation.getConversationid() + " 的消息 "+ message.getMessageId() +" 已被接收");
  }
}

// 设置事件响应接口
AVIMClient.setClientEventHandler(new CustomNetworkHandler());
AVIMMessageManager.setConversationEventHandler(new CustomConversationHandler());
AVIMMessageManager.registerDefaultMessageHandler(new CustomMsgHandler());

支持富媒体之拉扯消息

地方的代码演示了安发送简单文本信息,但是今之交互方式已经越多样化,图像、语音、视频都是老广阔的消息类型。v2
版的 LeanCloud IM SDK 已经好生好地支持这些富媒体消息,具体说明如下:

基类:AVIMTypedMessage

抱有富媒体消息之基类,其声明也

//SDK定义的消息类型,LeanCloud SDK 自身使用的类型是负数,所有正数留给开发者自定义扩展类型使用,0 作为「没有类型」被保留起来。
enum AVIMReservedMessageType {
  UnsupportedMessageType(0),
  TextMessageType(-1),
  ImageMessageType(-2),
  AudioMessageType(-3),
  VideoMessageType(-4),
  LocationMessageType(-5),
  FileMessageType(-6);
};

public abstract class AVIMTypedMessage extends AVIMMessage {
  public AVIMTypedMessage();

  public int getMessageType();

  @Override
  public final String getContent();

  @Override
  public final void setContent(String content);
}

文件消息(AVIMTextMessage)

AVIMTypedMessage 子类,表示一般的公文消息,其声明也

public class AVIMTextMessage extends AVIMTypedMessage {
  public String getText();
  public void setText(String text);

  public Map<String, Object> getAttrs();
  public void setAttrs(Map<String, Object> attr);
}

好观看,对于文本消息,主要的特性有 textattr 两单,通过简单的
getter/setter 就得拜到。要发送文书消息,示例代码为:

AVIMTextMessage message = new AVIMTextMessage();
message.setText("hello");
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("message sent.");
    }
  }
});

文件消息(AVIMFileMessage)

AVIMTypedMessage
子类,用来发送带附件的音讯,开发者可以为此其来发送「离线文件」。对于此类消息,LeanCloud
IM SDK 内部会优先将文件上传到 LeanCloud 文件存储服务器(自带 CDN
功能),然后拿文件首先数据(url,文件大小等等)放在信息包内发送至
LeanCloud 实时通信服务端。其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMFileessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMFileMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 实例,构造消息对象
public AVIMFileMessage(AVFile file);

及公事消息看似,文件消息也支撑附带文本及其他自定义属性,可以经如下方法上加
/ 获取更多信息:

  • String getText() / void setText(String text)
  • Map<String, Object> getAttrs() / void setAttrs(Map<String,
    Object> attr);

出殡文书消息之示范代码为:

String localZipfilePath;
try {
  AVIMFileMessage message = new AVIMFileMessage(localZipfilePath);
  message.setText("这是你要的文档");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

接纳到这样消息后,开发者可以透过以下办法,获取到文件首先数据(size
等)和一个分包二上制数据的 AVFile 对象:

  • AVFile getAVFile() 方法会返回一个二进制文件的 AVFile
    实例,之后好经过 AVFile 来成功多少下载或者其他操作,具体可参见
    AVFile
    说明
  • String getFileUrl() 方法会返回二进制文件之 url
  • long getSize() 方法会返回二进制文件的实在尺寸(单位:byte)
  • Map<String, Object> getFileMetaData()
    可以取得二进制文件之任何元数据信息。

图像信息(AVIMImageMessage)

AVIMFileMessage
子类,专门为此来发送图像及附带文本的插花消息,其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMImageMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMImageMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 实例,构造消息对象
public AVIMImageMessage(AVFile file);

出殡图像信息之以身作则代码为:

String localImagePath;
try {
  AVIMImageMessage message = new AVIMImageMessage(localImagePath);
  message.setText("你说我好看不?");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

收纳至这样消息随后,开发者可以经过如下方法,获取到几图像元数据(width,height,图像
size)和一个蕴含图像数据的 AVFile 对象:

  • int getWidth() 方法会返回图像的宽窄(单位:pixel)
  • int getHeight() 方法会返回图像的万丈(单位:pixel)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会返回一个图像文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会返回图像文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会返回图像文件的其实尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会返回随图像一起发送的公文信息。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以收获图像的其余元数据信息。

节奏消息(AVIMAudioMessage)

AVIMFileMessage
子类,专门为此来发送语音及附带文本的夹消息,其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMAudioMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMAudioMessage(File localFile) throws FileNotFoundException, IOException;   
// 传入 AVFile 实例,构造消息对象
public AVIMAudioMessage(AVFile file);

发送音频消息的言传身教代码为:

String localAudioPath;
try {
  AVIMAudioMessage message = new AVIMAudioMessage(localAudioPath);
  message.setText("听听我唱的小苹果:)");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

接及这么消息随后,开发者可以由此如下方法,获取到多文章频元数据(时长
duration、音频 size)和一个富含音频数据的 AVFile 对象:

  • double getDuration() 方法会返回音频的长度(单位:秒)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会返回一个音频文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会返回音频文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会返回音频文件的实在尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会返回随音频一起发送的文本信息。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以获音频的别元数据信息。

视频信息(AVIMVideoMessage)

AVIMFileMessage
子类,专门为此来发送视频与附带文本的鱼龙混杂消息,其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMVideoMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMVideoMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 文件,构造消息对象
public AVIMVideoMessage(AVFile file);

出殡视频信息的示范代码为:

String localVideoPath;
try {
  AVIMVideoMessage message = new AVIMVideoMessage(localVideoPath);
  message.setText("敢不敢跟我比一比");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

吸纳及这般消息之后,开发者可以可以由此如下方法,获取到几看到频元数据(时长
duration、视频 size)和一个暗含视频数据的 AVFile 对象:

  • double getDuration() 方法会返回视频的尺寸(单位:秒)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会返回一个视频文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会返回视频文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会返回视频文件的实在尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会返回随视频一起发送的文书信息。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以博视频的别样元数据信息。

地理位置信息(AVIMLocationMessage)

AVIMTypedMessage
子类,支持发送地理位置信息和附带文本的良莠不齐消息,其声明也:

public class AVIMLocationMessage extends AVIMTypedMessage {
  public String getText();
  public void setText(String text);

  public Map<String, Object> getAttrs();
  public void setAttrs(Map<String, Object> attr);

  public AVGeoPoint getLocation();
  public void setLocation(AVGeoPoint location);
}

以及公事消息看似,地理位置信息才是增加了一个 AVGeoPoint 的 Location
属性。要发送位置信息的示范代码为:

AVIMLocationMessage message = new AVIMLocationMessage();
message.setText("快点过来!");
message.setLocation(new AVGeoPoint(15.9, 56.4));
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("message sent");
    }
  }
});

接到至如此的音随后,开发者可以取得到实际的地理位置数据。

怎么样吸收富媒体信息

新版 LeanCloud IM SDK 内部封装了针对性富媒体消息的支持,所有富媒体消息都是自
AVIMTypedMessage 派生出的。发送的时段可直接调用
conversation.sendMessage()
函数。在接收端,我们啊特别增加了同近乎回调接口
AVIMTypedMessageHandler,其定义为:

public class AVIMTypedMessageHandler<T extends AVIMTypedMessage> extends MessageHandler<T> {

  @Override
  public void onMessage(T message, AVIMConversation conversation, AVIMClient client);

  @Override
  public void onMessageReceipt(T message, AVIMConversation conversation, AVIMClient client);
}

开发者可以编制好的信处理 handler,然后调用
AVIMMessageManager.registerMessageHandler(Class<? extends AVIMMessage> clazz, MessageHandler<?> handler)
函数来注册目标 handler。

接收端对于富媒体消息之通告处理的示范代码如下:

class MsgHandler extends AVIMTypedMessageHandler<AVIMTypedMessage> {

  @Override
  public void onMessage(AVIMTypedMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    switch(message.getMessageType()) {
    case AVIMReservedMessageType.TextMessageType:
      AVIMTextMessage textMsg = (AVIMTextMessage)message;
      Logger.d("收到文本消息:" + textMsg.getText() + ", msgId:" + textMsg.getMessageId());
      break;
    case AVIMReservedMessageType.FileMessageType:
      AVIMFileMessage fileMsg = (AVIMFileMessage)message;
      Logger.id("收到文件消息。msgId=" + fileMsg.getMessageId() + ", url=" + fileMsg.getFileUrl() + ", size=" + fileMsg.getSize());
      break;
    case AVIMReservedMessageType.ImageMessageType:
      AVIMImageMessage imageMsg = (AVIMImageMessage)message;
      Logger.id("收到图片消息。msgId=" + imageMsg.getMessageId() + ", url=" + imageMsg.getFileUrl() + ", width=" + imageMsg.getWidth() + ", height=" + imageMsg.getHeight());
      break;
    case AVIMReservedMessageType.AudioMessageType:
      AVIMAudioMessage audioMsg = (AVIMAudioMessage)message;
      Logger.id("收到音频消息。msgId=" + audioMsg.getMessageId() + ", url=" + audioMsg.getFileUrl() + ", duration=" + audioMsg.getDuration());
      break;
    case AVIMReservedMessageType.VideoMessageType:
      AVIMVideoMessage videoMsg = (AVIMAudioMessage)message;
      Logger.id("收到视频消息。msgId=" + videoMsg.getMessageId() + ", url=" + videoMsg.getFileUrl() + ", duration=" + videoMsg.getDuration());
      break;
    case AVIMReservedMessageType.LocationMessageType:
      AVIMLocationMessage locMsg = (AVIMLocationMessage)message;
      Logger.id("收到位置消息。msgId=" + locMsg.getMessageId() + ", latitude=" + locMsg.getLocation().getLatitude() + ", longitude=" + locMsg.getLocation().getLongitude());
      break;
    }
  }

  @Override
  public void onMessageReceipt(AVIMTypedMessage message, AVIMConversation conversation, AVIMClient client) {
  }
}
MsgHandler msgHandler = new MsgHandler();
AVIMMessageManager.registerMessageHandler(AVIMTypedMessage.class, msgHandler);

LeanCloud IM SDK 内部消息分发的逻辑是这么的:对于收受的任一新消息,SDK
内部还见面先解析消息的类别,根据项目找到开发者也当下同种类注册之处理
handler,然后挨家挨户调用这些 handler 的 onMessage
函数。如果没找到专门处理就无异门类消息之 handler,就会传送给
defaultHandler 处理。

这样一来,在开发者也 TypedMessage(及其子类) 指定了特别的
handler,也指定了全局的 defaultHandler
了之早晚,如果发送端发送的凡通用的 AVIMMessage 消息,那么受端就是
AVIMMessageManager.registerDefaultMessageHandler()中指定的 handler
被调用;如果发送的凡 AVIMTypedMessage(及其子类)的信,那么受端就是
AVIMMessageManager.registerMessageHandler()中指定的 handler 被调用。

哪扩大自己的富媒体消息

持续给
AVIMTypedMessage,开发者也堪扩大自己之富媒体消息。其要求和步骤是:

  • 贯彻新的消息类型,继承自 AVIMTypedMessage。这里要注意少触及:
    • 于 class 上搭一个 @AVIMMessageType(type=123) 的
      Annotation,具体信息类型的值(123)由开发者自己支配(LeanCloud
      内建的音类型应用负数,所有正数都留下给开发者扩展使用)。
    • 于信息里属性上只要增加 @AVIMMessageField(name=””) 的
      Annotation,name
      也而卜字段以宣称字段属性,同时自定义之字段要起照应的
      getter/setter 方法。
  • 调用
    AVIMMessageManager.registerAVIMMessageType(Class<? extends AVIMTypedMessage> messageType)
    函数进行路注册
  • 调用
    AVIMMessageManager.registerMessageHandler(Class<? extends AVIMMessage> clazz, MessageHandler<?> handler)
    函数进行信息处理 handler 注册。

AVIMTextMessage 的源码如下,可供参考:

@AVIMMessageType(type = -1)
public class AVIMTextMessage extends AVIMTypedMessage {

  @AVIMMessageField(name = "_lctext")
  String text;
  @AVIMMessageField(name = "_lcattrs")
  Map<String, Object> attrs;

  public String getText() {
    return this.text;
  }

  public void setText(String text) {
    this.text = text;
  }

  public Map<String, Object> getAttrs() {
    return this.attrs;
  }

  public void setAttrs(Map<String, Object> attr) {
    this.attrs = attr;
  }
}

群组聊天

及前面的单聊类似,群组聊天吗欲事先建一个对话(AVIMConversation),然后发送、接收新的信息。

开创群组

暨单聊类似,建立一个大多人数闲聊的群组也是充分简短的。例如:

Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_Group);
imClient.createConversation(clientIds, attr, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了!
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

事业有成以后,我们虽可以上聊天界面了。

于群组发送信息

出殡信息非常简单,与眼前单聊的场景平。

我们会注意到,AVIMConversation 还有一个殡葬信息之办法:

public void sendMessage(final AVIMMessage message, final int messageFlag,
      final AVIMConversationCallback callback)

要这里 flag 的概念来如下三种类型:

  • 暂态消息(AVIMConversation.TRANSIENT_MESSAGE_FLAG)。这种消息未会见受活动保存(以后在历史信息中无法找到她),也无支持延迟收,离线用户还不见面收推送通知,所以适合用来做控制协议。譬如聊天过程被「某某在输入中…」这样的状态信息,就称通过暂态消息来发送。
  • 常见消息(AVIMConversation.NONTRANSIENT_MESSAGE_FLAG)。这种信息就是是咱无限常用之音类型,在
    LeanCloud
    云端会自动保存起来,支持延迟收及离线推送,以后在历史信息被可以找到她。
  • 欲回执消息(AVIMConversation.RECEIPT_MESSAGE_FLAG)。这否是千篇一律种植平凡消息,只是消息被对方接到后
    LeanCloud 服务端会发送一个回执通知给发送方(这虽是
    AVIMMessageHandler 中
    public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client)
    函数被调用的会)。

收到群组消息

收下一个群组的信息,与接纳单聊的信呢是平的。

分子管理

于询问到聊天室成员之后,可以给用户约一些温馨的朋友进入,作为管理员也可去除一些「可怕」的分子。
投入新成员的 API 如下:

// 假设需要邀请 Alex,Ben,Chad 三人加入对话
List<String> userIds = new ArrayList<String>();
userIds.add("Alex");
userIds.add("Ben");
userIds.add("Chad");
conversation.addMembers(userIds, new AVIMConversationCallback() {
  @Override
  public void done(AVException error) {
    if (null != error) {
      // 加入失败,报错.
      error.printStackTrace();
    } else {
      // 发出邀请,此后新成员就可以看到这个对话中的所有消息了。
      Logger.d("invited.");
    }
  }
});

敬请成功之后,相关方收到通知之时序是这么的:

    操作者(管理员)                    被邀请者                        其他人
1, 发出请求 addMembers
2,                               收到 onInvited 通知
3, 收到 onMemberJoined 通知      收到 onMemberJoined 通知      收到 onMemberJoined 通知

对应地,踢人常的调用 API 是:

List<String> userIds = new ArrayList<String>();
userIds.add("Alex");
conversation.kickMembers(userIds, new AVIMConversationCallback() {
  @Override
  public void done(AVException error) {
    if (null != error) {
      // 失败,报错.
      error.printStackTrace();
    } else {
      // 成功。
      Logger.d("kicked.");
    }
  }
});

踢人时常,相关方收到通知之时序如下:

    操作者(管理员)                被踢者                       其他人
1, 发出请求 kickMembers
2,                          收到 onKicked 通知
3, 收到 onMemberLeft 通知                             收到 onMemberLeft 通知

注意!
只要请、踢人操作发生的时节,被邀请者/被踢者当前不在线,那么通知消息并无会见叫离线缓存,所以他们更上线的时光用未会见吸纳通知。

获历史信息

LeanMessage 会将非暂态消息自动保存在云端,之后开发者可以经过
AVIMConversation 来得到该对话的有历史信息。获取历史信息之 API 如下:

String oldestMsgId;
long oldestMsgTimestamp;
conversation.queryMessages(oldestMsgId,oldestMsgTimestamp, limit, new AVIMHistoryMessageCallback(){
  @Override
  public void done(List<AVIMMessage> messages, AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,可以将消息加入缓存,同时更新 UI
    }
  }
});

注意:
取历史信息之上,LeanCloud
云端是自从有条信息开始,往前头寻找开发者指定的 N
条消息,返回给客户端。为这个,获取历史信息需要传入三独参数:起始消息之
msgId,起始消息之殡葬时间戳,需要得到之音条数。

由此这同样 API 拿到的消息就是 AVIMMessage 或 AVIMTypedMessage
实例数组,开发者可以像前收到新消息通知一致处理。

启用离线消息推送(仅针对 iOS 平台用户中)

无论是独自聊还是群聊,当用户 A
发出消息继,如果目标对话中产生一对用户眼前不在线,LeanCloud
云端可以供离线推送的章程来唤醒用户。这同样效果默认是关门的,你可以
LeanCloud 应用控制台中拉开它。开启方法如下:

  • 签到 LeanCloud 应用控制台,选择对的采取上;
  • 择最上的「消息」服务,依次点击左边菜单「实时信息」->「设置」;
  • 在右手「iOS
    用户离线时之推送内容」下填好您要推送出去的音内容,保存;

诸如此类 iOS 平台及之用户就得接受 Push Notification
了(当然,前提是运用本身申请到了 RemoteNotification
权限,也用对的推送证书上传至了 LeanCloud 控制台)。

群组消息不打扰(仅对 iOS 平台用户中)

无论是单聊还是群聊,对于发于普通的 Conversation
的寻常消息,如果接收方当前不在线,LeanCloud 云端支持通过 Push
Notification
的方式进行提示。一般情况下就还是不行好之,但是一旦某个群组特别活泼,那离线用户就会见接到过多的推送,会形成不略的扰乱。

本着是 LeanCloud IM 服务也允许单个用户来关闭/打开某个对话的离线推送功能。

招来群组

凭是单聊,还是群聊,在 LeanCloud IM SDK
里面还是对话(Conversation)。我们于对话设置了之类几种植属性:

  • conversationId,字符串,对话 id,只读,对话创建之后由 LeanCloud
    云端赋予一个大局唯一的 id。
  • creator,字符串,对话创建者 id,只读,标识对话创建者信息
  • members,数组,对话参与者,这里记录了富有的参与者
  • name,字符串,对话的名,optional,可用来对群组命名
  • attributes,Map/Dict,自定义属性,optional,供开发者自己扩大用。

咱们提供了特别的好像,来探寻一定的群组:通过 imClient.getQuery()
得到一个 AVIMConversationQuery 实例,然后调用
AVIMConversationQuery.wherexxx
多样措施来充实约原则。例如要摸时报到用户参与的具备群聊对话,其代码为

// 搜索 Tom 参与的所有群组对话
List<String> clients = new ArrayList<String>();
clients.add("Tom");
AVIMConversationQuery conversationQuery = imClient.getQuery();
conversationQuery.containsMember(clients);

// 之前有常量定义:
// const int ConversationType_OneOne = 0;
// const int ConversationType_Group = 1;
conversationQuery.whereEqualTo("attr.type", ConversationType_Group);

conversationQuery.findInBackground(new AVIMConversationQueryCallback(){
  @Override
  public void done(List<AVIMConversation> conversations, AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      if (null != conversation) {
        Logger.d("找到了符合条件的 " + conversations.size() + " 个对话");
      } else {
        Logger.d("没有找到符合条件的对话");
      }
    }
  }
});

AVIMConversationQuery 中设置条件的点子和 AVQuery 类似。这里
conversationQuery.containsMember()
表示对话的成员被至少含有这些人口,可用来因一些成员查找对话;与之类似的还有一个
conversationQuery.withMembers()
则表示有还只发生这些分子,用来冲所有成员查找目标对话;conversationQuery.whereXXX()
层层措施可用来界定对话名称及打定义属性,这里而强调的少数是,对于自定义属性之约规范,属性名一定要盖
attr 开头,如上例所示,限定额外的 type 条件的上需要指定的属于性名是
attr.type。具体可参考其头文件。

开放聊天室

绽开聊天室(也吃暂态对话)可以用来很多地方,譬如弹幕、直播等等。在
LeanCloud IM SDK
中,开放聊天室是同看似非常的群组,它也支撑创造、加入/踢来成员等操作,消息记录会被保存并不过供应获取;与日常群组不等同的地方实际体现为:

  • 免支持查询成员列表,你可以透过相关 API 查询在线人数;
  • 匪支持离线消息、离线推送通知等作用;
  • 从不成员参加、离开的打招呼;
  • 一个用户同样破登录只能在一个盛开聊天室,加入新的绽开聊天室后会见活动离开原的聊天室;
  • 投入后半钟头内断网重连见面自行进入原聊天室,超过这个时尽管需要重新加入;

创立开放聊天室

与平常的群组类似,建立一个放聊天室也是生粗略的,只是于
AVIMClient.createConversation(conversationMembers, name, attributes, isTransient, callback)
中我们用传入 isTransient=true 选项。例如:

Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_Group);
imClient.createConversation(clientIds, name, attr, true, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了,进入聊天室
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

创立成功以后,我们就算好进入聊天界面了。开放聊天室的别样操作,都跟普通群组操作一样。

在开放聊天室

如若任何极端用户还足以进入开放聊天室。作为开发者,我们得以经过通过特定条件检索到具备开放聊天室,然后允许用户自由参加,其示范代码为:

conversation.join(new AVIMConversationCallback(){
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,此时可以进入聊天界面了。。。
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

询问在线人数

通过 AVIMConversation.getMemberCount()
方法可以实时查询开放聊天室的在线人数。示例代码如下:

conversation.getMemberCount(new AVIMConversationMemberCountCallback(){
  @Override
  public void done(Integer memberCount, AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,此时 memberCount 的数值就是实时在线人数
    }
  }
});

签字和安

为了满足开发者对权力和证明的渴求,LeanCloud
还规划了操作签名的编制。我们可以 LeanCloud
应用控制台中的「设置」->「应用选项」->「聊天推送」下面勾选「聊天服务签约认证」来启用签名(强烈推荐这样做)。启用后,所有的用户登录、对话创建/加入、邀请成员、踢来成员等操作都急需证明签名,这样开发者就足以针对信息进行充分的主宰。

客户端即时边究竟该如何以呢?我们只是待贯彻 SignatureFactory
接口,然后于用户登录之前,把此接口的实例赋值给 AVIMClient
即可(AVIMClient.setSignatureFactory(factory))。

设定了 signatureFactory 之后,对于急需鉴权的操作,LeanCloud IM SDK
与劳务器端通讯的时还见面带动齐用自己别的 Signature 信息,LeanCloud
云端会下 app 的 masterKey 来证实信息的行之有效,保证聊天渠道的安康。

对于 SignatureFactory 接口,我们就待实现即点儿独函数即可:

  /**
   * 实现一个基础签名方法 其中的签名算法会在SessionManager和AVIMClient(V2)中被使用
   */
  public Signature createSignature(String peerId, List<String> watchIds) throws SignatureException;

  /**
   * 实现AVIMConversation相关的签名计算
   */
  public Signature createConversationSignature(String conversationId, String clientId,
      List<String> targetIds, String action) throws SignatureException;

createSignature
函数会在用户登录的上让调用,createConversationSignature
会在对话创建/加入、邀请成员、踢来成员等操作时给调用。

乃得做的哪怕是准前文所陈述之签名算法实现签约,其中 Signature
声明如下:

public class Signature {
  public List<String> getSignedPeerIds();
  public void setSignedPeerIds(List<String> signedPeerIds);

  public String getSignature();
  public void setSignature(String signature);

  public long getTimestamp();
  public void setTimestamp(long timestamp);

  public String getNonce();
  public void setNonce(String nonce);
}

中四单属性分别是:

  • signature 签名
  • timestamp 时间戳,单位秒
  • nonce 随机字符串 nonce
  • signedPeerIds 放行的 clientId 列表,v2 中已经废不用

脚的代码展示了因 LeanCloud
云代码进行签字时,客户端的落实有,你可参见她来成功好之逻辑实现:

public class KeepAliveSignatureFactory implements SignatureFactory {
 @Override
 public Signature createSignature(String peerId, List<String> watchIds) {
   Map<String,Object> params = new HashMap<String,Object>();
   params.put("self_id",peerId);
   params.put("watch_ids",watchIds);

   try{
     Object result =  AVCloud.callFunction("sign",params);
     if(result instanceof Map){
       Map<String,Object> serverSignature = (Map<String,Object>) result;
       Signature signature = new Signature();
       signature.setSignature((String)serverSignature.get("signature"));
       signature.setTimestamp((Long)serverSignature.get("timestamp"));
       signature.setNonce((String)serverSignature.get("nonce"));
       return signature;
     }
   }catch(AVException e){
     throw (SignatureFactory.SignatureException) e;
   }
   return null;
 }

  @Override
  public Signature createConversationSignature(String convId, String peerId, List<String> targetPeerIds,String action){
   Map<String,Object> params = new HashMap<String,Object>();
   params.put("self_id",peerId);
   params.put("group_id",convId);
   params.put("group_peer_ids",targetPeerIds);
   params.put("action",action);

   try{
     Object result = AVCloud.callFunction("group_sign",params);
     if(result instanceof Map){
        Map<String,Object> serverSignature = (Map<String,Object>) result;
        Signature signature = new Signature();
        signature.setSignature((String)serverSignature.get("signature"));
        signature.setTimestamp((Long)serverSignature.get("timestamp"));
        signature.setNonce((String)serverSignature.get("nonce"));
        return signature;
     }
   }catch(AVException e){
     throw (SignatureFactory.SignatureException) e;
   }
   return null;
  }
}

LeanCloud IM SDK
专注做好底层的报道服务,有再度多好定制化的地方,譬如说:

  • 账户体系及 IM 系统是分别的;
  • 消息成为离线推送的时,推送内容开发者是得定制的;
  • 透过 web hook,开发者可以对信息进行再次多处理;
  • 闲聊过程中经过信息鉴权机制,开发者可以来双重多控制;

为缺乏 UI
组件,实事求是地提在新用户接入成本恐怕小大,但是在工作范围壮大、产品需求变换多后,相信大家见面愈加喜欢
LeanCloud 这种随意灵活的用体验,以及稳定快速的劳动品质。