编者的话:如果有其他的朋友愿意在CocoaChina分享自己的应用或游戏还有在开发中发生的小故事,都可以投稿或者联系QQ2670924929
小私密,是一款匿名分享你的小私密的轻社交应用。
在这里,你可以分享那些可能不能和朋友、同事、亲人说的小私密,而又不用担心身份被泄露。你也可以评论那些小私密,帮助解决ta的困扰。让我们共同创造一个和谐、友好、融洽的轻社交平台。
此应用由我独立构思、功能设计、编码、数据采集及维护、测试,最终完成的另一个个人项目。在这之前上架了两款较简单的应用(请看文章底部),另外有一款影视类app被苹果爸爸无情的扼杀在摇篮之中- -!。
因为我不会UI设计,因此找了前同事:“鳝鱼”,进行沟通,他也很乐意帮助我完成这个项目,所以项目的所有UI部分都由他完成。在这里也非常感谢他的付出。(你是不是想问为什么叫:鳝鱼?老司机哟~~~哈哈哈)。
之所以“轻”社交,因为小私密
通过昵称和密码的方式进行登录注册,简直方便到爆炸~~~
页面真的很少,但是功能健全。
核心功能很简单,就是私密的分享和浏览,以及很少的辅助功能:评论、个人信息、系统消息、反馈等等。
所有操作都是匿名的。你发什么、评论什么都不用担心别人知道你是谁,当然,违规的东西会被屏蔽。
没有任何复杂的社交活动,因为就连那个查看用户信息都不保证真实性~~~哈哈哈。
开发初衷
想到要做一款这样的App,是因为个人就是想弄点东西出来,不管简单还是复杂,之前已经上过两款及其简单的应用,所以再来一个稍微不简单的东西,岂不完美?在加上8月份入职一家新公司,一直在干和UI不想关的东西,不想因此生疏纯应用开发能力,因此最后决定开发小私密。和鳝鱼沟通UI的时候,他告诉我非常乐意帮忙因为他觉得这个做完上架对他出去面试会有所帮助,因此我们一拍即合。
开发过程记录
项目开发周期其实较长,因为是个人项目只能利用业余时间去做,并且我不能像一般程序员那样熬夜久坐撸代码(腰椎病、肩周炎),加之除了UI之外所有的东西都是我在做,因此周期拉长到数月之久。平时晚上只写一小时,打一局LOL,周末也是看情况写。项目本身的编码并不难,主要是统筹与这个项目所有有关的东西以及不是全职做这个的原因,所以比较费时间。
时间轴:
2017.09.09
构思应用功能点,确定了应用整体功能框架以及核心功能,因为是做个人应用,本不想做的很复杂,因此确定了基本点:轻社交。
2017.09.09~09.14
确定应用名:小私密。其实也很符合这个应用的宗旨。没错~~~我想了5天名字??。。。
2017.09.16~09.19
搭建项目框架,确定几个功能要点:
使用Leancloud的数据服务。
使用阿里云的文件服务。
只提供昵称、密码登陆方式,就算是选择三方登陆也仅仅是获取头像、昵称,仍需输入密码,并且昵称不能重复(可以理解为昵称唯一)。
页面精简,只有主列表、用户menu页、详情页、发布页及其他小页面(修改昵称、系统消息、意见反馈等)。
内容方式包括文字、图片、音频。
只做一级评论,不做二级以上。
提供用户完善账户信息入口:微信号、QQ号、手机号(这玩意儿并不能保证真实有效性)。
可查看某用户的信息(联系方式),以诱导分享应用。
暂时不做推送功能(个推)。
如果有人用的话,计划还会每天晚上11点清查数据,剔除违规数据(色情、暴力、血腥等等)。
2017.09.19
给鳝鱼提供功能说明文档,因为鳝鱼也是业余时间做,因此是需要等UI的,这期间申请相关开发账户,并进行应用无关UI层面的开发,包括:数据api请求、通用控件、缓存等。
2017.09.23 将Leancloud替换为Bmob作为后端数据服务,虽然Bmob相比Leancloud在稳定性会差很多,体验也不如Leancloud - -!但是它便宜。。。(很久之前Leancloud绝逼是首选)。这两个也就是像我这种个人开发做个小东西用用了,个人觉得商用很垃圾,小打小闹可以玩玩。
2017.09.24 弃用阿里云文件服务,直接使用Bmob的文件服务。
2017.09.25 阉割音频功能,以及对上传的图片进行大比例压缩处理,原因是流量消耗太大。后面再根据使用情况将文件系统切换回阿里云存储服务,再将音频功能加进去以及不对图片处理。
2017.09.30~2017.10.25 收到大部分UI,开始绘制页面,因为鳝鱼的时间安排决定暂时不专门做iphone X的适配。
2017.10.28 去医院看腰椎花了800多~腰肌劳损了- -!在这里提醒各位程序猿,注意身体!不要长期伏案工作,定期起身做下伸展运动。
2017.11.03 编码全部完成(第一版),边做边测、坐地铁测、回家测...碍于不是专业测试以及我只有一部9.3.3的5s和一部11.0.3的6s,因此在功能以及某些机型的适配问题我无法准确定位,决定先上线第一版,希望能通过bug分析以及用户的反馈(当然。。。有人用才行呐),不断完善这个应用。
2017.11.04 着手准备写一个iPad版的后台管理应用(纯粹是因为我就没开发过iPad的应用,想试试),针对小私密的使用情况。初步考虑加入功能:
1:用户量及用户男女比例。
2:定义系统消息,推给全用户或个别用户。
3:用户反馈查看及通过系统消息反馈给用户。
4:用户举报查看审核、删除违规信息,并通过系统消息反馈给用户。
5:用户联系信息人工审核。
6:私密数统计。
7:数据库表总行数统计。
2017.11.04 发现一个数据库表的重大问题,进行数据表的改造。
2017.11.05 小私密1.0提审。
2017.11.07 拒审
拒审原因:仅支持iPhone却不支持iPad,但是仍需要在iPad正常显示和使用,因为我只勾选了iPhone,且登陆页对ipad的适配出现问题导致。
解决:勾选Universal即可,因为我几乎全部用的都是xib和AutoLayout,因此在iPad上显示效果还是很OK的,没有太大问题。
另外修复了一些bug。
重提。
2017.11.08 拒审
拒审原因:登陆不了~~~
解决:重提。
不得不说苹果的网路是真尼玛坑。
2017.11.09 拒审
拒审原因:违规内容,造成不适。
解决:因为我都已做了处理,包括:用户协议提示、系统消息提示、举报措施。苹果爸爸根本没好好测就特么给我驳回。重提。
2017.11.10 审核通过!小私密1.0上线啦~~~
2017.11.28 提交一个更新版,更换启动页和引导页,之前那个是很仓促做的,另外修复了部分bug。最近和鳝鱼合作另一款App,敬请期待~
工程部分展示
工程整体架构:
AppDelegate AppDelegate
XSMUser 用户模块
Controller 控制器类
Model 模型类
View View
Expand 工具,包括:扩展、网络、缓存、宏、全局函数
Vender 自定义的工具类
Resource 资源文件
Other 其他文件,这里丢的是基类文件(少用继承)
整体架构
工程使用的pods框架:
Bugly 腾讯的一个bug统计服务
FDFullscreenPopGesture 全局手势
IQKeyboardManager 键盘监控
Masonry 布局
ReactiveCocoa RAC
TZImagePickerController 照片选择
UMengAnalytics-NO-IDFA 友盟统计
WechatOpenSDK 微信SDK
YYKit ibireme的全能工具
AliyunOSSiOS 阿里云服务(暂时不用,以后可能要用所以先留着)
工程使用的自定义功能类:
BQLAudioManager 音频工具
BQLImageBrowser 图片浏览(本地、网络)
BQLLoadingView 加载动画
BQLWebView web
BQLItemLayout 图片排版
BQLRouter 页面跳转
BQLSlideMenu 左滑菜单
BQLAuthEngine 分享工具
挑几个简单的功能点说说
1.系统消息
不同于公司级别的应用,个人应用在数据处理方面比较麻烦。比如拉取系统消息是不是就只能不区分用户呢?当然不是,可以通过给系统表添加一个accetper字段标记该条消息的接受者,如果为空则表示所有用户都接收,不为空则对应某一用户或多个用户,通过api比对选择性的过滤掉消息。
2.用户头像
因为应用内用户头像统统都是圆形,因此在用户上传头像的时候就是传的圆形头像,这样客户端在显示头像的时候就不用做处理,而是直接显示。这样做的好处就是:一次处理,所有用户都能不处理就直接显示。
3.图片浏览
图片浏览功能是我自己写的,功能及其简单,提供本地图和网络图的显示。其中网络图使用UIImageView+YYAdd。
图片在显示的时候经过裁剪处理。
贴两张图看下:
左边的是常规显示,右边为浏览模式
常规显示的样子是根据容器size裁剪过的,浏览模式为正常图片size,不过仍进行了一些简单的计算。另外关于浏览的动画,做法是拿到所点击的图片以及这一组图的容器的frame,再计算该图在全屏下的显示尺寸,进行缩放动画。另外就是在hide的时候先将该原图隐藏,在动画结束之后再显示,不然会造成图片在缩回原来的过程中出现两张图(这是我做法的缺陷,因此这样修复)。如果你喜欢这张图长按即可存储图片。
这套图片浏览比较简单,效果比较生硬,勿喷。
浏览模式的简单计算代码:
if (image.size.height / image.size.width > self.height / self.width) {
obj.imageView.height = floor(image.size.height / (image.size.width / self.width));
}
else {
CGFloat height = image.size.height / image.size.width * self.width;
if (height < 1 || isnan(height)) height = self.height;
height = floor(height);
obj.imageView.height = height;
}
if (obj.imageView.height > self.height && obj.imageView.height - self.height <= 1) {
obj.imageView.height = self.height;
}
4.RAC
工程里大量使用这个,这不是什么新鲜的东西,但是真的很好用哟~在Xcode9里面,RAC很多警告。
解决方案:
1.利用#pragma clang diagnostic ignored 过滤@weakify(self)以及@strongify(self)的警告。
2.使用pod 'ReactiveCocoa', :git => 'https://github.com/zhao0/ReactiveCocoa.git', :tag => '2.5.2'替换pod 'ReactiveCocoa'来解决RACObserve的警告(此方案出处我忘记了。。。好像就是简书的ioser写的博客,有知道的给我留言我加上备注出处)。
5.评论
用户评论某一条小私密的时候,成功之后应该实时刷新评论列表,正常的做法是重新拉取服务端数据。但是我比较抠门。。。我的做法是:发表评论成功之后直接本地将该条评论数据推到第一条,伪造成刷新成功的假象。评论成功后将列表滚动到第一行防止某些情况下该条“最新”评论被遮挡的情况。
这样做的好处是节约api调用次数,缺点也非常明显,举个例子:如果在你评论的时候其他用户也评论了,那么你无法看到,除非退出再进详情页。
因为是个人应用,可能使用的人并不多,因此这个缺点对我来说,无关痛痒。
6.新评论提醒
因为不做推送(指的是个推,群推还是有的),因此当别人评论你的时候,你该怎么知道呢?我的做法是:建一张remindTable,每次评论某一条小私密的时候,在表中插入一条数据,列名包括:小私密发布者id、小私密id。每次启动应用(或者每次进入首页)的时候拉取这张表数据,比对看看有没有和本号有关的数据,如果有则表示你有新评论啦~然后选择进入该条小私密查看,并删除remindTable对应的关于本号且对应该条小私密的数据,表示已阅。
其实拉取数据的方式并不友好,因为这样会导致在这一次拉取到下一次之间的评论提醒是没有的,不过我考虑到一条评论要提醒,10条评论同样是提醒,因此就忽略这个问题,采用这种方式。
7.应用分享
关于分享跳转,小私密很单一:1.转到app store下载页。2.转到app store评论页。对,你没看错,因为我没有官网主页,哈哈哈哈。
8.诱导分享和评价
在查看用户联系方式的时候,有10%的几率会弹出Pop页,Pop引导内容又有50%的几率分别为评价应用和分享应用。这10%概率不高,我觉得刚合适。
9.关于修改个人信息的一个小问题
用户在修改个人信息比如昵称、性别、头像时,只在显示个人信息的地方做了实时修改,并未在私密列表页做跟进修改,需要刷新页面才能看到你已经修改后的样子。这样做导致:当前私密列表中正好有一条你发布的小私密,且在可视区,此时你又去修改了个人信息,修改成功会pop回来主界面,这个时候列表中你的信息还是修改之前的,需刷新一下。我觉得不是什么大问题因此未作处理。
10.其他
小私密是xib结合代码进行开发,几乎所有的控制器、pop页都是xib完成,首页cell是代码实现。
小私密的首页数据展示过程为:data -> model -> layout -> show。从服务端拉取数据然后创建对应模型,再通过layout计算该模型下的cell高度,这里我同时也对数据做了二次处理,剔除一些错误无效的数据。最后才通过tableView展示。高度是在展示之前就已经计算出来,因此一定程度上保证了列表的顺滑度。另外列表中“新评论”、“删除”按钮是选择性的展示,因此是通过hidden属性来决定展示与否,也就是不要在cell中动态这些控件,应该在初始化时就都创建完毕再通过hidden属性来操作。
还是在列表页,你可以发现cell有一个卡片的效果,有部分阴影和圆角,这里我直接使用了图片来实现。
详情页中,私密详情是从列表带过来的,而且布局直接使用了cell中的布局,这里并未进行任何计算。评论数据经过了延迟拉取,且通过一个菊花表示拉取过程,并未采取拉取评论数据时整个页面展示加载动画这种方式,我觉得这样比较友好。
所有的pop页都使用了lazy load的方式加载,因为你可能并不会去点击他们,比如举报、分享、删除这些按钮,还包括图片浏览。当然,我还是很希望你能多点点“分享”的。
使用CABasicAnimation做加载、pop动画。
还有很多地方需要进一步简化流程、代码优化,任重而道远呐。
写在最后
***这只是个我闲情逸致弄的一个小应用,没有想会有很多人会用,其次鳝鱼哥也考虑到这个上架应用会给他出去面试多多少少能加点分~~~。
当然,为了单纯的想完善这个应用,在这里还是希望各位看官们能够帮帮忙:
如果你没有使用过小私密,但却有什么好的想法,请给我留言。
如果你用过小私密,有功能上的一些建议或者发现一些bug,请给我留言。
如果你也是一名developer,对于这个项目在技术实现上有一些建议,请给我留言。
非常感谢!
ps:我已上架另两款app:么么天气、occupyBox
其中occupyBox已放开源码:https://github.com/biqinglin/occupyBox
作者:咖喱luya