本人两年半Java后台工做体味,因公司项目需要,转为IOS开发,"零根底"自学objective-c,第一个项目开发完毕,做下总结分享。项目包罗常用app的根本功用,及时通信,第三方集成等。
0.媒介
本人14年12月份,从网站开发组转到了挪动开发组,本身的java两年半工做体味酿成了objective-c零体味。2015年1月份新启动了一个挪动项目,年后因为人事情动,本身从辅助开发酿成了"核心"开发,目前项目根本接近尾声,下面停止总结,期看对一些人能有搀扶帮助, 别的也期看iOS大牛停止批示
1.项目介绍
项目属于一款社区类软件,包罗小组/帖子,视频,文章,评论,选举搜索,立即通信,老友,第三方登录/分享,推送等,涵盖常用app的根本功用
2.项目利用的第三方开源库
上的统计
项目利用了CocoaPods(类似java中的maven)治理常用的第三方库,一些特殊的零丁引用,下面介绍下比力好用的几个
2.1.AFNetworking
目前比力选举的iOS收集恳求组件,默认收集恳求是异步,通过block回调的体例对返回数据停止处置。
需要重视的是AFNetworking对办事器返回的ContentType要求比力严厉,默认只撑持application/json的返回。所以可能需要添加对text/html返回的撑持,不然可能无法获得返回数据。
别的就是文件上传,那里选举利用第二种
[formData appendPartWithFormData: name:];
[formData appendPartWithFileData: name: fileName: mimeType:];
AFNetworking是异步的,也能够利用同步的收集恳求办法.第一种只需要传进表单名和文件流,源码也是根据文件流获得对应的文件名和文件类型,然后挪用第二种办法。但是楼主碰着了利用第一种办法,提交后后台揣度为非文件上传,无法获得文件流。还有假设后台是根据文件后缀文件类型,那么第一种也无法利用。
2.2.FMDB
对sqlite数据库操做停止了封拆,demo也比力简单
2.3.MBProgressHUD
也是iOS项目常用的一个组件,用于展现过渡效果的,好比收集恳求之前展现loading,收集完毕隐躲loading。定见封拆在BaseViewController中,所有ViewController持续就能利用
2.4.MJRefresh
那个是传智播客李明杰教师的做品,本身的oc根底就是看他的视频半个周末就根本拿下了。MJRefresh次要用于刷新操做,供给了常用的刷新操做,还有刷新动画,用着很好用。定见把办法封拆在BaseViewController中,如许修改刷新操做时,就只需要改动一份。(之前用的旧版MJRefresh,只撑持通俗的刷新,不撑持动画,后来更新后版本改变比力大,旧的办法已经不选举利用了,所以仍是封拆基类中利用比力好,便利以后修改)
2.5.SDWebImage
也是iOS最常用的一个组件,用户加载收集图片,能够缓存到当地。可能原理时,第一次加载后,会根据url加密做为文件名缓存在当地,假设再次加载图片时,就间接从当地加载。用着也比力简单。那里也分享碰着的一个问题,先从收集加载一张小图,然后小图做为占位图,再从收集加载一张大图
[imageView sd_setImageWithURL:[NSURL URLWithString:imageURLString] placeholderImage:DefaultPostPic];
[imageView sd_setImageWithURL:[NSURL URLWithString:_bigImageURLStringArray[i]] placeholderImage:imageView.image options:SDWebImageDelayPlaceholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
2.6.RDVTabBarController
一个TabBar组件,能够便利设置底部菜单的文字图片,点击效果,小红点提醒等
2.7.Toast
类似android的toast提醒效果,封拆在BaseViewController中,需要的处所停止提醒
2.8.XMPPFramework
iOS独一的xmpp类库,做者在往年8月份添加了xep-0198协议撑持(流治理,用于xmpp断线重连),但是通过pod停止更新时,无法下载到最新版本,可能0198还没有完美妙,无法做为正式版。
2.9.TPKeyboardAvoiding
用户键盘弹出主动计算高度,停止屏幕滚动操做
2.10.AMR
做立即通信的音频处置,目前我们的立即通信利用的灌音文件是m4a,便于web端的音频播放
2.11.TQRichTextView
用于做富文本视图控件展现,用于立即通信的脸色展现,以及资本评论的富文本展现
2.12.CSGrowingTextView
用做立即通信文本框和评论文本框利用,能够展现多行输进
2.13.MJExtension
也是李明杰教师的做品,用于json转model停止利用,有点类似于java中谷歌的Gson。转换效率据说也很高,利用也比力简单,只要前后台约定好,json间接就转成了model。一个工做多年的iOS伴侣说,一个项目次要的是对model层的治理,他选举的是Mantle。不外MJ那个更轻量级点,用着也愈加简单。
3.东西和插件介绍
Xcode
iOS开发的官方东西,也没此外抉择。有些功用做确实实挺帅的,好比StroyBoard的挈拽事务绑定。不爽的处所就是没有代码格局化,别的点击办法,可能跑到别的一个类中了!!别的右边的目次也不会主动发作改变,定位到对应文件,需要command+shift+j
SimPholders2
能够快速找到模仿器对应的沙盒目次,启动后右侧顶部东西栏有个类似封闭按键的按钮,展现比来的几个利用,点击就进进到了对应的沙盒目次
VVDocumenter-Xcode
xcode东西,///生成注解模板,xcode那功用都不给集成,唉
其他的根本就不消介绍了,有的也不怎么好用。SVN能够利用Cornerstone,Git能够利用SourceTree,sqlite能够利用SQLite Professional(不外是收费的,免费的只能查看),还能够用火狐阅读器的sqlite插件。
4.集成友盟
友盟,供给了App和运用的一站式处理计划。公司上个挪动项目用到了友盟的推送办事,那个项目中, 还利用了分享,第三方登录的功用,本身也亲身参与到了相关集成。友盟的开发者文档还算是比力全的,碰着问题能够联络客服或者到友盟的论坛找处理计划。
4.1.关于推送
iOS推送分为当地推送和长途推送,当地推送是指当地本身弹出信息,别的一个就是长途推送,当利用未启动时,也能收到相关推送信息。我们项目没有利用当地推送,利用的都是友盟的长途推送。包罗动静(聊天)和通知(用户信息通知)中。用户在聊天过程中,手机除了发送立即通信以外,也挪用后台接口,发送友盟推送。别的用户的帖子,评论,存眷,点赞等城市由后台挪用友盟的推送。
友盟推送(别的一个域名)包罗单播,列播,和播送,此中播送限制次数天天3次,能够和友盟申请进步次数,其他不限制次数,目前来看单播速度仍是挺快的。利用友盟推送,需要在苹果开发者账号中,新建两个推送证书,提交给友盟(友盟有详尽的文档,能够参考)。能够在友盟后台,把测试设备的deviceToken加到友盟推送的后台,从友盟后台倡议推送。(需要64位token,需要通过办法停止计算,间接在xcode或者ituns中拿到token不可)
推送的可能流程就是,手机在第一次启动app的时候开启推送办事,手机在启动app的时候,注册友盟办事,同时把deviceToken提交到本身的后台,后台能够在需要的时候拿着deviceToken挪用友盟的推送接口,友盟再往倡议苹果的推送办事,使对应的设备收到长途推送信息。
4.2.关于第三方登录和分享
那块儿都在友盟的社会化分享中,里面供给了比力全面的文档。定见第三方分享模块不消本身特殊设想,能够利用友盟的默认分享模块(我们项目标分享模块本身停止了设想,包罗了收躲,所以整块都需要自定义写UI和写分享代码)。关于友盟的第三方登录和分享需要重视的时,QQ和微信登录分享,都需要手机上安拆利用,appstore审核会卡那点,所以需要揣度手机能否安拆利用,隐躲没有安拆利用的图标,那块儿友盟的sdk已经有相关的揣度办法(应该是友盟集成了QQ和微信sdk,QQ和微信sdk供给了揣度办法)。
第三方登录分享需要到相关的平台注册开发者账号。微信开发者账号(重视不是订阅号)第三方登录需要交钱才气开通,能够撑持微信和伴侣圈分享。QQ开发者账号能够撑持QQ和QQ空间分享(QQ微博似乎需要微博开发者账号)。新浪微博需要微博开发者账号。QQ分享开发阶段需要把测试账号加成开发者账号的老友才气测试,微博也类似。
第三方登录本身碰着了QQ提醒不是最新版的文本,在友盟论坛中找到领会决计划。
第三方登录,我们项目集成了QQ,微信,新浪微博登录。三个平台都能获得用户的screen_name(用户名称),以及对应的平台独一的id,此中QQ和微信都是openid,新浪是userid。
第三方分享,文档供给了分享图片,视频,语音。假设是分享url,需要设置对应平台的分享地址,参考处理计划,好比
[UMSocialData defaultData].extConfig.电话Data.url = shareUrl;
[UMSocialData defaultData].extConfig.qzoneData.url = shareUrl;
[UMSocialData defaultData].extConfig.wechatSessionData.url = shareUrl;
[UMSocialData defaultData].extConfig.wechatTimelineData.url = shareUrl;
别的分享到QQ空间,必需指定一张图片,不然不克不及分享胜利。
第三方分享定见封拆到一个类中,我们项目是几个详情页都有分享,评论,举报,收躲,点赞等功用。封拆在一个BaseDetailViewController中的,相关页面持续,同时传进对应的资本类型,只用庇护一份代码。
5.立即通信
立即通信网上有第三方的处理计划,好比环信,融云等。我们是本身搭的xmpp办事器,办事器利用的tigase,之前写过相关的博客,本身往年也做了对应的webim。前段时间看了环信webim的sdk,利用的也是strophe的js类库,相关实现跟我们的差不多,但是本身搭建xmpp会碰着了很多问题,好比丢动静!所以假设想比力快速的实现im,选举利用第三方的处理计划。
挪动端的丢动静可能是那个样子。A和B通信,A发了一条动静给办事器,办事器发给B,但是B收集欠好掉线了,而办事器却不晓得B退出了(B一般退出会给办事器发下线通知),所以动静丧失了。XMPP中有xep-0184协议(动静回执),A给B发动静,动静体中带一行代码(要求动静回执),当B收到动静后发送一条回执,证明我收到了。后来XMPP又有了xep-0198协议(流治理),断线后快速重链,同时揣度必然时间收不到动静,就把动静写离线动静,削减丢动静情状。但是可能收集情状冗杂,加上各类不确定因素,还会呈现丢动静的问题。目前比力靠谱的办法就是存所有的聊天笔录,由手机端根据时间点往数据库拉动静,只要他人发出的动静就不会丢。
此次立即通信模块停止了相关改动,也是参考了之前开发人员的一些定见。好比用户返回home的时候,断开xmpp毗连(iOS进进后台后,只要5秒的处置时间,特殊办法可耽误到10分钟,假设内存不敷,利用随时就被杀死了)。所以返回home时就断开,进进利用再毗连。同时利用利用形态下,有心跳检测,揣度能否连结毗连。
考虑到iOS的特殊性,我们摘取了xmpp和长途推送都走的办法,推送的自定义动静体和xmpp动静体一样,动静的处置办法一样。用户聊天发送xmpp动静的同时也挪用我们的动静推送接口挪用友盟push(push能够设置过时时间,制止特殊情状,推送延时,聊天完毕了才收到推送)。一是处理iOS利用未启动时的推送领受,二是处理xmpp丢动静的问题。
关于推送,AppDelage中有两个办法,一个是利用中收到推送,不会提醒,会间接处置推送信息。别的是法式非利用形态,收到推送,会停止提醒,能够点击推送动静进进利用,获取那一条推送动静的推送动静(需要重视,点击推送启动利用拿到信息时view还没有加载,动静不克不及立即处置)。
android端因为是实后台,能够后台不断连结运行,无论收到xmpp动静仍是友盟推送,都能够本身停止处置,然后本身弹一个当地推送(也有短处,假设android法式杀死,就无法承受动静和推送)。iOS端因为后台不成控,所以推送利用长途推送,进进利用毗连xmpp再收全数离线动静(不包管友盟推送能否包管及时)。当然大部门都仍是一般情状,收集情状比力好的前提下,就实时收到了xmpp的动静或者长途推送。我们又不是QQ和微信,只要包管用户看到的数据能连结一致性就行了(所以QQ和微信就是diao啊)。
根据测试反应的情状,iOS那个利用的丢动静情状比上个利用有必然改进。详细情状再进一步看察把。
我们的立即通信也包罗语音和图片,摘用的是,第一时间两边更新形态。
6.项目总结
目前项目已经接近尾声了,再过不到半月就要上线了。本身算是项目标次要负责人了。项目前期iOS和android有一周多前期筹办和框架搭建,别的就是我根据页面原型,定义接口文档开发方案,协调开发。可能各人项目体味也都不多把,框架和接口或多或少城市有点问题,跟着体味渐渐积存必定城市越来越好的。关于iOS的总结下:
1.框架搭建的时候,要考虑好App中各功用点的实现计划。设想好相关文件目次,封拆相关类文件。
2.封拆整理相关办法,好比BaseViewController中包罗,根本ui,顶部导航条,左按钮,右按钮,题目,相关点击事务,展现/隐躲loading,收集恳求失败同一处置办法,上拉/下拉刷新绑定,刷新展现/隐躲。阐发项目中的功用不异模块,封拆对应操做,不异功用代码庇护一份。
3.考虑好刷新机造,好比A页面进进B页面,B更新后,返回后A页面的刷新,假设摘用block/delegate的办法,能够同一停止设想。或者多个页面之间的数据刷新,摘用通知的体例(KVO),停止更新操做。尽量开发阶段,就把可能呈现的问题提早处理。
4.确定能否停止相关页面统计,好比加友盟的页面统计,需要设置相关view的viewWillAppear和viewWillDisappear()
5.ViewController中初始化view和数据恳求后刷新view代码别离,封拆整理好收集恳求前和恳求后的操做,考虑好下拉刷新页面和上拉加载更多的相关数据恳求和处置。考虑有网形态下的数据缓存以及无网形态下的缓存数据加载
6.提早做好相关页面的跳转,代码解耦,不竭优化和重构代码。发现问题或者有更好的处理计划,尽量早期就停止修改,制止修修补补,便利后期庇护和扩展。在能够承受的情状下,能够牺牲一些系能,连结逻辑简单,便于庇护。
7.通过代码写view计算坐标时,尽量参考上一个元素的坐标和宽高,如许当一个元素位置或宽高发作改变时,其他元素根本都能跟着发作改变。
8.数据处置能放在办事器端处置就由办事器端处置,前台就停止无脑展现
9.考虑法式的兼容性,32位和64位一些变量的值差别,重视值的越界问题。重视法式的内存问题,和利用过程中的内存改变
10.考虑信息的平安性,沙盒存储的信息能够被查看修改,重要信息请加密