实现IM基本功能,并且在细节、完成度、bugfree上媲美任何主流IM应用
Switch branches/tags
Nothing to show
Clone or download
Latest commit 3844586 Dec 15, 2016
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
AMap Initial Commit Nov 18, 2016
HyphenateSDK Initial Commit Nov 18, 2016
LLWeChat.xcodeproj 适配IOS10,权限、NavigationBar Nov 24, 2016
LLWeChat.xcworkspace Initial Commit Nov 18, 2016
LLWeChat 修改Appkey Nov 24, 2016
ScreenShot 更新ScreenShot Nov 19, 2016
.gitignore Initial Commit Nov 18, 2016
Podfile Initial Commit Nov 18, 2016
Podfile.lock Initial Commit Nov 18, 2016
README.md Update REAMME.md Dec 8, 2016
产品设计.md 添加产品设计文件 Nov 24, 2016

README.md

LLWeChat 1.0

本README包含18张效果图,约36M大小,载入时间较长,请耐心等待

##写在前面 1、我是以极认真的态度来做这个项目,我不想把它做成一个只能展示给人看的Demo,经不起实际使用,只能远观不可亵玩, 那样没什么意思。
2、我不想使用假数据, 所以消息通讯使用环信SDK,保证聊天完全真实。同时对环信SDK进行了彻底封装,做到业务代码和环信完全隔离。
3、在整个开发过程中,我以媲美微信为目标, 同时参考支付宝、易信、陌陌和钉钉。以万为目标必能过千,这个项目还是有闪光点的。
4、整个开发过程就我一人,没有什么Word文档,我的产品文档就是赤裸裸的截屏,到现在为止微信截屏将近300张。
你们一定好奇,干吗要截屏这么多,因为微信的细节是做的最到位的,我想这也是微信一家独大的一个成功因素吧 。
5、我只专注于聊天模块,其他功能一概而过,点到为至。添加好友是项目完整性需要,消息搜索纯粹就是想换换大脑,做点别的。
6、每一个功能,我会把自己的APP和这五款APP在细节、完成度、bugfree这三个方面作对比,直到我满意为止。我说我的APP不比任何商用的差,不是我站在这张嘴胡咧咧,而是我在一个细节一个细节的对比中、完善中得出的:LLWeChat,不逊于任何人。
7、这个项目今年07-15开始,原来打算练练手就得了,没想到越做越认真, 做了3个月,国庆后完善了1个月。由于一个人精力实在有限,第一个版本到此结束。
8、我iOS是阅读开源项目入的门,这个项目躺在硬盘里也没什么用,晾出来希望对大家有所帮助。

##雕琢细节 要想媲美微信,就必须要雕琢细节,在细节上下功夫,做到位。否则细节上马马虎虎,媲美微信就是一句空话。

###(一)、消息输入 ####1、输入面板基本功能


####2、输入框动态调整高度

  • 细节1:当行数增加、减少时,做出动画,而不是一步到位。
  • 细节2:除非用户滚动文本,否则文本编辑时不允许出现某一行只漏出一部分。

####3、草稿 当一个会话有草稿时,应该在会话push动画开始时就完成如下工作:
读取最新13条消息,解析消息,获取消息缩略图,布局输入框并显示草稿最后一行,弹出键盘(尤其是第三方键盘),布局TableView。
当首次进入会话时,如何高效完成这些工作是一个很大的挑战。我花费了许多力气,但还是不太满意。

###(二)、GIF

  • 细节1:内存大小。把GIF转成imageView,内存会暴涨,不可行。只能播一帧获取一帧图片
  • 细节2:重用。GIF快速重用时,因为是后台获取帧图片需要处理好同步,还得记住播放进度,以便重用回来的时候继续播放


###(三)、文本

  • 细节1:文本中包含的链接有三个行为:点击、长按、高亮。高亮要细心处理,否则效果会很糟糕:滚动文本触及了链接不高亮,点击链接必高亮,高亮后依然允许滚动,触发滚动取消高亮等
  • 细节2:文本全屏浏览的触发方式(下面有说明),全屏浏览进入退出时的动画。
  • 细节3:AppleSDK识别文本中URL不太精确,需要自己提供正则式,暂未实现。

####1、文本链接

###(四)、地图

  • 细节1:地图附近POI搜索,我想根据用户位置、当前时间等做推荐式搜索,暂未实现。
  • 细节2:点击地图Cell后要支持侧滑返回,系统默认的NavigationBar交互式返回动画效果不太好,但也可以接受。

####1、地图基本功能

####2、地图搜索

###(五)、ImagePicker ImagePicker做了PhotoKit和AssetLibrary适配

  • 细节1:整个ImagePicker的核心就是决定一张照片获取方式是同步还是异步,照片质量是fullScreen还是fullResolution;
    AssetLibrary框架要自己决定, 而PhotoKit框架替你做了一部分。
  • 细节2:需要考虑照片或视频已经被用户删除的情况,这时选择、全屏浏览、发送要特殊处理下

####1、照片浏览

####2、照片发送

####3、视频发送

###(六)、照片视频浏览

  • 细节1:长照片弹出弹入动画,在ImageView做Frame动画的同时,其包含的image也会从当前偏移位置滚动到目标偏移位置。
  • 细节2:视频使用AVPlayer播放,而AVPlayer需要占用主线程,使得快速浏览时明显卡顿,我的解决方法就是用视频第一帧图片代替视频滚动,滚动结束时关联AVPlayer和VideoURL,当用户点击播放按钮或拖动进度条时把图片换成真正的视频。
  • 细节3:适应屏幕旋转。特别当用户在设备水平朝向时,点击返回。需要先把照片视频旋转到竖立方向,然后再做弹出动画。
  • 细节4:照片视频浏览时的bottomBar的切换,照片视频下载状态的更新,这块规则很多很杂,不列举了

####1、照片视频弹入弹出动画

####2、视频下载

###(七)、语音

  • 细节1:按压录音按钮小于0.25秒, 弹录音太短Tip,大于则变按钮title为“松开 结束”同时录音开始;小于1.25秒,弹录音太短Tip;大于1.25秒出现录音动画,此时录音时长刚好1秒。51秒时弹倒计时,60秒时强制结束录音并取消录音按钮按压事件。
  • 细节2:录音时APP进入后台,则结束并发送录音。再返回APP时,录音按钮第一次点击无效,不清楚原因,暂未解决。
  • 细节3:播放录音有:音量太低Tip,播放模式切换,未读声音联播等

####1、语音录制


####2、录音最大时长

###(八)、缓存 ####1、MessageCell缓存

  • GIF、日期消息只重用,不缓存
  • 整个APP默认缓存MessageCell 1300条,超出的消息采用TableView重用机制
  • 退出当前会话后,保留会话最近MessageCell 130条
  • 自定义数值,可在LLMessageCellManager中更改

####2、照片、视频缩略图

  • 本项目没有采用环信SDK提供的缩略图,而是APP负责缩略图的创建、存储、删除
  • 照片、视频MessageCell不可见时就清空缩略图,可见时再读取缩略图
  • 为了加快缩略图读取,内存中默认缓存缩略图上限80M
  • APP运行时会把一段时间内未读取过的缩略图从硬盘上删除
  • 自定义数值可在LLMessageThumbnailManager中更改

###(九)、其他 其他界面只实现了最简单的功能

####1、批量删除

  • 细节1:弹出的ActionSheet在键盘之上

####2、添加好友

####3、消息搜索

####4、新消息通知

##项目基本信息

  • 开发语言:Objective-C
  • 最低部署版本:iOS8.0
  • 支持iOS版本:iOS8、iOS9、iOS10
  • 手机适配:iPhone6 plus最好,iPhone6次之。其他机型没有兼顾到

##第三方库

  • 环信SDK(71M),已包含在项目中
  • 高德SDK(15.6M),已包含在项目中
  • MBProgressHUD,已包含在项目中
  • Github下载项目Zip包大小:40M

##项目安装 1、切换到Podfile文件所在目录,运行 pod install (当前版本Podfile内容为空)
2、使用高德地图,请到高德官网注册APP Key,然后替换掉LLGDConfig.h头文件中APPKey即可。
注册步骤为:注册成为开发者->点击右上角控制台->我的应用->创建新应用
3、运行LLWeChat.xcworkspace
4、输入账号/密码(未注册时) 5、点击注册即可(自动登录)

##项目目录 |目录 | 说明| | ---------- | -----------| | General | 该目录包含和项目耦合性最低的通用模块,包括声音管理器、照片选取器、通用UI、Utilities等 | | Server | 该目录封装环信SDK,环信SDK一共封装成四个类:
1、LLClientManager:管理用户的注册、登陆、登出等
2、LLChatManager:管理会话消息的收发、本地消息的加载更新等
3、LLContactManager: 管理好友列表
4、LLSDKError:环信SDK错误码的封装| | Data | 数据目录,包括Config、Cache、Model等 | | Client | 该目录是项目的主体,按照业务功能分类,分为会话、聊天、搜索、通讯录、设置等| Server、Data可以直接访问SDK,Client代码不允许直接访问环信SDK,要把环信SDK和Client完全隔离开

##产品设计 产品设计上的一些想法,汇总在产品设计

##下个版本 下个版本实现如下功能:
1、小视频
2、语音、视频通话
3、消息搜索、上拉刷新
4、群聊
5、通讯录

##更新日志:2016-11-24 1、删除stable分支,只保留master、develop两个分支,越简单越好。
2、适配IOS10,原项目在IOS10运行会直接奔溃。

##Licenses 本项目所有LL-开头的源码遵守MIT license. 本项目绝大部分资源归腾讯公司所有