使用 Flutter 快速实现聊天应用

会话列表要展示当前用户所参与的会话,会话名称、会话的成员,会话的最后一条消息。还需要展示未读消息数目。

会话列表对应 Conversation 表,查询当前用户的全部会话只需要下面两行代码:

ConversationQuery query = client.conversationQuery();

await query.find();

按照会话的更新时间排序:

query.orderByDescending(‘updatedAt’);

为了展示会话的最新一条消息,查询的时候要额外加上这行代码:

//让查询结果附带一条最新消息

query.includeLastMessage = true;

这样会话页面的后端数据就搞定了。下面看一下如何显示数据。

会话查询成功返回的数据格式是 Conversation 类型的 List。

  • conversation.name 即会话的名称

  • conversation.members 即会话成员

  • conversation.lastMessage 就是当前会话的最新一条消息了。

未读消息数的处理

如果要在 Android 设备上运行,需要在初始化 Java SDK 的时候加上下面这行代码,表示开启未读消息数通知:

AVIMOptions.getGlobalOptions().setUnreadNotificationEnabled(true);

swift SDK 是默认支持,无需额外设置。

可以监听 onUnreadMessageCountUpdated 时间获取未读消息数通知:

client.onUnreadMessageCountUpdated = ({

Client client,

Conversation conversation,

}) {

// conversation.unreadMessageCount 即该 conversation 的未读消息数量

};

注意要在以下两处清除未读消息数:

  • 在对话列表点击某对话进入到对话页面时

  • 用户正在某个对话页面聊天,并在这个对话中收到了消息时

会话详情页面


上拉加载更多历史消息

查询聊天记录的时候,先查最近的 10 条消息,然后以第一页的最早的消息作为开始,继续向前拉取消息:

List messages;

try {

//第一次查询成功

messages = await conversation.queryMessage(

limit: 10,

);

} catch (e) {

print(e);

}

try {

// 返回的消息一定是时间增序排列,也就是最早的消息一定是第一个

Message oldMessage = messages.first;

// 以第一页的最早的消息作为开始,继续向前拉取消息

List messages2 = await conversation.queryMessage(

startTimestamp: oldMessage.sentTimestamp,

startMessageID: oldMessage.id,

startClosed: true,

limit: 10,

);

} catch (e) {

print(e);

}

修改会话名

对话的名称是会话表 Conversation 默认的属性,更新会话名称只需要执行:

await conversation.updateInfo(attributes: {

‘name’: ‘New Name’,

});

图片、语音消息

LeanCloud 即时通信 SDK 提供了下面几种默认的消息类型,Demo 中只用到了文本消息,图像消息和语音消息。

  • TextMessage 文本消息

  • ImageMessage 图像消息

  • AudioMessage 音频消息

  • VideoMessage 视频消息

  • FileMessage 普通文件消息(.txt/.doc/.md 等各种)

  • LocationMessage 地理位置消息

注意,图片与语音消息需要先保存成 LCFile,然后再调用发消息接口发消息。

比如发送音频消息。第一步先保存音频文件为 LCFile:

LCFile file = await LCFile.fromPath(‘message.wav’, path);

await file.save();

第二步,再发消息:

//发送消息

AudioMessage audioMessage = AudioMessage.from(

binaryData: file.data,

format: ‘wav’,

);

await this.widget.conversation.send(message: audioMessage);

还要注意 iOS 设备发送图片消息注意打开相册和相机权限,语音消息需要麦克风权限:

NSMicrophoneUsageDescription

录音功能需要访问麦克风,如果不允许,你将无法在聊天过程中发送语音消息。

NSCameraUsageDescription

发送图片功能需要访问您的相机。如果不允许,你将无法在聊天过程中发送图片消息。

NSPhotoLibraryUsageDescription

发送图片功能需要访问您的相册。如果不允许,你将无法在聊天过程中发送相册中的图片。

离线推送通知


当用户下线以后,收到消息的时候,往往希望能有推送提醒。最简单的一种推送设置就是在 LeanCloud 控制台 > 消息 > 即时通讯 > 设置 > 离线推送设置 页面,填入:

{ “alert”: “您有新的消息”, “badge”: “Increment” }

这样 iOS 设备有离线消息的时候会收到提醒。这里 badge 参数为 iOS 设备专用,用于增加应用 badge 上的数字计数。

如果想在 Android 设备上实现离线推送,要增加一步接入 Android 混合推送

当然在实际项目中,离线消息的提醒往往会要求更加具体,比如推送中要包括消息的内容或者消息类型等。LeanCloud 也提供了其他几种定制离线推送的方法,感兴趣可以自行查阅文档

还要注意,iOS 推送一定要正确配置 配置 APNs 推送证书,并打开 Xcode 的推送开关:

7

AppDelegate.swift 中开启推送,要这样设置:

import Flutter

import LeanCloud

import UserNotifications

@UIApplicationMain

@objc class AppDelegate: FlutterAppDelegate {

override func application(

_ application: UIApplication,

didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?

) -> Bool {

do {

LCApplication.logLevel = .all

try LCApplication.default.set(

id: “你的APPID”,

key: “你的 APPKey”,

serverURL: “服务器地址”)

GeneratedPluginRegistrant.register(with: self)

/*

register APNs to access token, like this:

*/

UNUserNotificationCenter.current().getNotificationSettings { (settings) in

switch settings.authorizationStatus {

case .authorized:

DispatchQueue.main.async {

UIApplication.shared.registerForRemoteNotifications()

}

case .notDetermined:

UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in

if granted {

DispatchQueue.main.async {

UIApplication.shared.registerForRemoteNotifications()

}

}

}

default:

break

}

_ = LCApplication.default.currentInstallation

}

return super.application(application, didFinishLaunchingWithOptions: launchOptions)

} catch {

fatalError(“(error)”)

}

}

override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

/*

set APNs deviceToken and Team ID.

*/

LCApplication.default.currentInstallation.set(

deviceToken: deviceToken,

apnsTeamId: “你的 TeamId”)

/*

save to LeanCloud.

*/

LCApplication.default.currentInstallation.save { (result) in

switch result {

case .success:

break

case .failure(error: let error):

print(error)

}

}

}

override func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {

//如果注册推送失败,可以检查 error 信息

print(error)

}

}

投诉举报、黑名单


在 APP Store 审核过程中,因为用户可以随意发送消息,被要求对用户生成的内容要有适当的预防措施。

要求提供下面这两条内容:

  • A mechanism for users to flag objectionable content

用户标记不良信息的机制,就是举报功能。

  • A mechanism for users to block abusive users

用户阻止滥用用户的机制,实际就是黑名单。

实现举报功能

我的解决办法是在消息处长按弹出举报窗口。

8

使用 LeanCloud 存储服务,新建一张 Report 表用于记录举报信息:

//保存一条举报信息

LCObject report = LCObject(‘Report’);

report[‘clientID’] = Global.clientID; //举报人

report[‘messageID’] = messageID; //消息 ID

report[‘conversationID’] = this.widget.conversation.id; //会话 ID

report[‘content’] = _selectedReportList.toString(); //举报内容

await report.save(); //保存举报信息

可以在控制台查看举报内容:

9

实现黑名单功能

10

我的解决办法是,在联系人列表处单击联系人弹框提示是否加入黑名单。

黑名单实现思路是新建一张 BlackList 表,来保存每个用户的黑名单列表,使用 LeanCloud 云函数 实现屏蔽消息。在 _messageReceived 这个 Hook 函数下(这个 hook 发生在消息到达 LeanCloud 云端之后),先查此条消息的发件人与收件人是否在黑名单列表,如果在黑名单列表就删除其中要求屏蔽的收件人,返回新的收件人列表。

实现起来也比较简单,把下面这个云函数粘贴在 LeanCloud 控制台 > 云引擎 >云函数在线编辑框中即可。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

om/2024/03/13/H4lCoPEF.jpg" />

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

[外链图片转存中…(img-vlIyxi8P-1713512376846)]

[外链图片转存中…(img-pY0wNrDe-1713512376847)]

[外链图片转存中…(img-EeQbC5Hh-1713512376848)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值