Coder Social home page Coder Social logo

leanmessage-demo's Introduction

LeanMessage WebApp

使用 LeanCloud 实时通讯搭建的聊天 WebApp。Live Demo

在找 iOS/Android Demo?iOSAndroid

功能

  • 登录
  • 聊天室、单聊、群聊
  • 系统对话实现的聊天机器人
  • 成员管理
    • 邀请、移除成员
    • 提升、撤销管理员
  • 群名称修改
  • 消息送达回执与已读回执
  • 未读消息
  • 「正在输入」状态
  • 消息撤回
  • 图片消息
  • 提及(@)对话成员
  • 表情
    • 小表情(Emoji)
    • 大表情(Sticker)

文档

即时通讯开发指南

本地开发、调试

  1. yarn
  2. yarn serve
  3. open http://localhost:3000/

部署

  1. 运行 yarn build 生成 dist 目录
  2. 将 dist 目录作为静态资源部署

实时通讯服务是通过校验 origin 来保证安全的,项目中默认的 AppID 是 LeanCloud 提供的测试 App 的 ID,仅允许 localhost:3000 来源的访问,当你需要在另外的域名上部署 LeanMessage WebApp 时,需要将 src/index.js 中的 appId 改为你的 LeanCloud 项目的 App ID,并且确认设置了你的域名为该项目的「安全域名」,更多关于安全方面的信息请参考 Web 安全域名

代码结构与功能

src/
├── app
│   ├── components      // 组件
│   │   ├── message                 // 消息 directive
│   │   ├── reverse-infinite-list   // 向上滚动无限加载列表 directive
│   │   └── user                    // 用户相关 service
│   ├── conversation    // 会话 view,app 主界面
│   │   └── conversationMessage     // 消息 view,会话 view 的子 view
│   └── login           // 登录 view
├── index.html          // 页面入口,ui-view 容器
├── index.js            // js 入口,注册依赖模块,启动 app
├── index.run.js        // 启动 app 的代码
├── index.scss
└── routes.js           // 配置路由

leanmessage-views

index.js

js 入口,申明依赖模块,配置依赖模块,注册 components 与 views,启动 app。 依赖的 LeanCloud 模块有:

依赖的 angular 模块有:

routes.js

配置 ui.router

index.run.js

启动 app 的脚本,通过监听 ui.router 的 stateChangeStart 事件在视图切换时检查用户登录状态。

How to

实现用户系统

为了方便与其他系统对接,LeanMessage 服务没有内建用户系统,只有作为唯一标识的 clientId,你需要在你的用户系统中维护用户与 clientId 的关系。你可以使用 LeanStorage 提供的「用户系统」。 本 demo 中没有关联用户系统,可以用任何的 id 登录服务。

leanmessage-demo's People

Contributors

binaryhb0916 avatar daweibayu avatar dependabot[bot] avatar jk2k avatar jwfing avatar leeyeh avatar lzwjava avatar nicecui avatar sdjdd avatar tang3w avatar wangxiao avatar weakish avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

leanmessage-demo's Issues

无法安装包

我无法安装依赖,项目无法运行,我尝试了npm和yarn等工具,npm提示依赖错误
image
像这样👆

我手动删除了一些冲突的依赖,但它不断出现新的错误
image
(我使用了node6.00、node6.9.2、node17.8.0、node18.12.1进行了尝试)
我应该如何安装并使用(仅仅是正常打开)这个项目?或者这个项目已经不再考虑维护了?

npm install 报错

node -v
v7.1.0
npm -v
3.10.9

运行npm install 报错
npm ERR! registry error parsing json
npm ERR! registry error parsing json
npm ERR! registry error parsing json

点击录音会crash

05-24 14:42:47.610 14811-14811/com.example.admin.leancloudimtest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.leancloudimtest, PID: 14811
java.lang.RuntimeException: setAudioSource failed.
at android.media.MediaRecorder.setAudioSource(Native Method)
at cn.leancloud.chatkit.view.LCIMRecordButton.startRecording(LCIMRecordButton.java:198)
at cn.leancloud.chatkit.view.LCIMRecordButton.startRecord(LCIMRecordButton.java:140)
at cn.leancloud.chatkit.view.LCIMRecordButton.onTouchEvent(LCIMRecordButton.java:96)
at android.view.View.dispatchTouchEvent(View.java:9300)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
at android.app.Activity.dispatchTouchEvent(Activity.java:2771)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
at android.view.View.dispatchPointerEvent(View.java:9520)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRoot

Android Demo 好多 crash

点击某条消息进入单聊的时候,下拉刷新会触发NullPointerException:

03-15 09:03:58.503 19423-19423/com.leancloud.im.guide E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.leancloud.im.guide, PID: 19423
                                                                        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.leancloud.im.guide/com.leancloud.im.guide.activity.AVSquareActivity}: java.lang.NullPointerException
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2469)
                                                                            at android.app.ActivityThread.access$1100(ActivityThread.java:151)
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:110)
                                                                            at android.os.Looper.loop(Looper.java:193)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5551)
                                                                            at java.lang.reflect.Method.invokeNative(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:515)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:730)
                                                                            at dalvik.system.NativeStart.main(Native Method)
                                                                         Caused by: java.lang.NullPointerException
                                                                            at com.leancloud.im.guide.activity.AVSquareActivity.getSquare(AVSquareActivity.java:93)
                                                                            at com.leancloud.im.guide.activity.AVSquareActivity.onCreate(AVSquareActivity.java:63)
                                                                            at android.app.Activity.performCreate(Activity.java:5310)
                                                                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2469) 
                                                                            at android.app.ActivityThread.access$1100(ActivityThread.java:151) 
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362) 
                                                                            at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                            at android.os.Looper.loop(Looper.java:193) 
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5551) 
                                                                            at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                            at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:730) 
                                                                            at dalvik.system.NativeStart.main(Native Method) 

有时是这种

03-15 09:06:54.071 21028-21028/com.leancloud.im.guide E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.leancloud.im.guide, PID: 21028
                                                                        java.lang.NullPointerException
                                                                            at com.leancloud.im.guide.fragment.ChatFragment$1.onRefresh(ChatFragment.java:70)
                                                                            at android.support.v4.widget.SwipeRefreshLayout$1.onAnimationEnd(SwipeRefreshLayout.java:185)
                                                                            at android.support.v4.widget.CircleImageView.onAnimationEnd(CircleImageView.java:107)
                                                                            at android.view.ViewGroup.finishAnimatingView(ViewGroup.java:5541)
                                                                            at android.view.View.draw(View.java:14687)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3099)
                                                                            at android.view.View.draw(View.java:14779)
                                                                            at android.view.View.getDisplayList(View.java:13615)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.View.draw(View.java:14470)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3077)
                                                                            at android.view.View.getDisplayList(View.java:13607)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.View.draw(View.java:14470)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3077)
                                                                            at android.view.View.getDisplayList(View.java:13607)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.View.draw(View.java:14470)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3077)
                                                                            at android.view.View.draw(View.java:14779)
                                                                            at android.widget.FrameLayout.draw(FrameLayout.java:534)
                                                                            at android.view.View.getDisplayList(View.java:13615)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.View.draw(View.java:14470)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3077)
                                                                            at android.view.View.getDisplayList(View.java:13607)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.View.draw(View.java:14470)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3077)
                                                                            at android.view.View.getDisplayList(View.java:13607)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.View.draw(View.java:14470)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3077)
                                                                            at android.view.View.getDisplayList(View.java:13607)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.View.draw(View.java:14470)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3268)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3077)
                                                                            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchDraw(PhoneWindow.java:2418)
                                                                            at android.view.View.draw(View.java:14779)
                                                                            at android.widget.FrameLayout.draw(FrameLayout.java:534)
                                                                            at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2398)
                                                                            at android.view.View.getDisplayList(View.java:13615)
                                                                            at android.view.View.getDisplayList(View.java:13662)
                                                                            at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1663)
                                                                            at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1538)
                                                                            at android.view.ViewRootImpl.draw(ViewRootImpl.java:2775)
                                                                            at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2637)
                                                                            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2253)
                                                                            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1210)
                                                                            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6408)
                                                                            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:807)
                                                                            at android.view.Choreographer.doCallbacks(Choreographer.java:610)
                                                                            at android.view.Choreographer.doFrame(Choreographer.java:578)
                                                                            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:793)
                                                                            at android.os.Handler.handleCallback(Handler.java:808)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                            at android.os.Looper.loop(Looper.java:193)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5551)
                                                                            at java.lang.re

Demo1 设计初稿

经过 2015-06-09 初步讨论,Demo 1的实现需求就是:用户下载demo 直接运行,输入 client id 直接进入一个我们预设的对话进行聊天。
基于此需求,设计了如下初稿。

image

设计稿在线地址为:https://www.processon.com/view/link/5577a1c4e4b0d6a77d97104d

Page 2功能解释:

  1. 日志记录的如下几个信息
  • 当前登陆的 client id 以及连接服务器的时间(以下涉及到时间均取本地的)
  • �当前 client 发送消息成功之后显示:消息:“你好” 发送成功 2015-06-10 12:22:05
  • 收到消息的内容和时间:消息 “你也好” 接受成功, 2015-06-10 12:22:05
    1. 初始化的时候不需要加载当前对话过去的聊天记录,而是交给用户下拉去获取
    2. 发送按钮仅仅实现发送文本信息即可。
      @lzwjava @jwfing

Demo 不应该包含的代码

  • 删除所有跟 NSUserDefaults 相关的调用,Demo 只保证一次运行是正确的即可,不需要存缓存,Demo 代码不需要考虑本地保留 ClientId 这种操作。
  • LoginViewControlleropenSessionAndGoMainViewController 的方法里面实现的打开 session 和跳转到 MainViewController ,这段逻辑直接加到 onLoginButtonClicked 中即可,Demo 封装的越多越会对用户造成困扰, Demo 就是越简单越好,不是越专业越好。
  • MainViewController 中的 onChatButtonClicked 中的调用 LeanMessageManager 的代码全都展示出来, LeanMessageManager 这个类必须在 Demo 中删除

layout 在 ipad 下无法自适应

不做过多的效果渲染,但是 在 ipad 上的布局至少要是看着不别扭。
image

或者可以只支持 iphone ,ipad 的 界面效果就暂时不做,xcode 里面就把 这个项目改成仅仅支持 iphone 也没什么问题。

web 版的 demo 必须给与用户配置 appid 以及 appkey 的入口

开发者在配置完 ios 的 demo 之后,需要跟另一端进行联调,web 版就是最好的一个入口,那么 web 版的 demo 也必须跟 ios 有一致的用户体验,目前 web 版本是内置了一个应用的 appid 以及 appkey,这样是不对的。
所以在 release ios demo 之前 web demo 也必须重构。

iOS Demo 运行起来界面是乱的

只有登录界面是正常的,进入聊天室后界面就是乱的,界面上随便点进去单聊界面连输入框都没有。

Xcode 8.1,iOS Simulator 9.3 and 10.1

将Android示例代码拷贝到AndroidStudio中运行时报错

Error:Execution failed for task ':app:packageDebug'.

Duplicate files copied in APK META-INF/LICENSE.txt
File 1: /Users/demon/Desktop/PushAndTalk/libs/fastjson.jar
File 2: /Users/demon/Desktop/PushAndTalk/libs/httpmime-4.2.4.jar
如果在build.gradle中加入
packagingOptions {
exclude 'META-INF/LICENSE.txt' }
则会出现Error:(25, 0) Gradle DSL method not found: 'packagingOptions()'
Possible causes:The project 'PushAndTalk' may be using a version of Gradle that does not contain the method.

web app 调试失败

/XX/leanmessage-demo-master/Web/gulp_tasks/karma.js:10
return failCount => {
^
SyntaxError: Unexpected token >
at Module._compile (module.js:439:25)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module._load (/XX/leanmessage-demo-master/Web/node_modules/gulp-hub/lib/load-subfile.js:26:32)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at module.exports (/XX/leanmessage-demo-master/Web/node_modules/gulp-hub/lib/load-subfile.js:30:4)
at /XX/leanmessage-demo-master/Web/node_modules/gulp-hub/lib/hub-registry.js:57:30
at arrayEach (/XX/leanmessage-demo-master/Web/node_modules/gulp-hub/node_modules/lodash/index.js:1289:13)

npm ERR! @ build: gulp
npm ERR! Exit status 8
npm ERR!
npm ERR! Failed at the @ build script.
npm ERR! This is most likely a problem with the package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! gulp
npm ERR! You can get their info via:
npm ERR! npm owner ls
npm ERR! There is likely additional logging output above.
npm ERR! System Darwin 16.0.0
npm ERR! command "node" "/usr/local/bin/npm" "run" "build"
npm ERR! cwd /XX/leanmessage-demo-master/Web
npm ERR! node -v v0.10.26
npm ERR! npm -v 1.4.3
npm ERR! code ELIFECYCLE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /XX/leanmessage-demo-master/Web/npm-debug.log
npm ERR! not ok code 0

Multiple dex files define Lcom/alibaba/fastjson/JSONStreamAware;

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/alibaba/fastjson/JSONStreamAware;

I use command+shift+o to search JSONStreamAware,and the result is it's single class.
this is my build.grade in app folder
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.flaviofaria:kenburnsview:1.0.6'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
compile 'com.viewpagerindicator:library:2.4.1@aar'
compile 'com.squareup.picasso:picasso:2.5.2'
//avoscloud-sdk 为 LeanCloud基础包
compile 'cn.leancloud.android:avoscloud-sdk:v3.+'
//avoscloud-push 与 Java-WebSocket 为推送与IM需要的包
compile 'cn.leancloud.android:avoscloud-push:v3.+@aar'
compile 'cn.leancloud.android:Java-WebSocket:1.2.0-leancloud'
//avoscloud-statistics 为 LeanCloud 统计包
compile 'cn.leancloud.android:avoscloud-statistics:v3.+@aar'
}

删除 loadMessagesWhenInit 以及 loadOldMessages 这 2 个实现

@lzwjava

用户在阅读 Demo 代码的时候初衷是看我们如何发送消息和接收消息,对本地缓存这种只有生产代码才会出现的逻辑,我们的开发者在第一次接触的时候完全不需要出现在他们的视线范围内。
因为只要我们的消息准确送达,做不做缓存,怎么做缓存,高级开发者都有自己的一套逻辑,Demo 做这个展现有点多余。

代码中 LeanMessageManager 会对初学者造成困扰

NSString *otherId = self.otherIdTextField.text;
    if (otherId.length > 0) {
        [[LeanMessageManager manager] createConversationsWithClientIDs:@[otherId] conversationType:ConversationTypeOneToOne completion: ^(AVIMConversation *conversation, NSError *error) {
            if (error) {
                NSLog(@"error=%@", error);
            }
            else {
                [self performSegueWithIdentifier:@"toChat" sender:conversation];
            }
        }];
    }

这段代码会给初学者(第一次接触 LeanMessage 的开发者)造成困扰:为什么你们官方 SDK 不把 LeanMessageManager 集成进去?而在 Demo 里面还封装了一套业务逻辑?

@lzwjava

我不建议 Demo 的代码需要遵照生产环境的逻辑严密性进行开发,Demo 只列出 SDK 最基本的接口,不需要做过多的逻辑判断。

android进入聊天室崩溃

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

在AVImClientManager.java中 AVIMClient.getInstance(clientId); 处理这句的时候报错。

消息接收,能不能像QQ一样显示某人已发来n条消息?

这个是用的推送,所以每条消息都会弹出来,一旦离线很久,就很多,但能不能在应用层怎么处理一下,让通知栏针对每个聊天对象只显示一条最新的消息或者所有对象都集合起来只显示一条通知,即未读消息数。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.