写在前面

从2015年12月开始到2017年3月在一个创业团队完整参与了一个运动类的手机APP的开发,虽然最后这个项目失败了但是我学到了很多东西,现在已经过去一段时间了可能已经忘记了一部分细节的东西了但是希望通过博客的方式能把我那段时间学习到的东西记录下来,虽然还有整个项目开发过程中的一些波折,但是我还是主要想分享技术,接下来我想写的都是纯干货~

项目背景

运动页是一个体育类的手机APP,拥有IOS客户端,Andriod客户端以及微信H5界面,主要的功能有:创建运动、搜索运动、运动报名、运动浏览、关注、分享、IM聊天、评论留言、在线支付、账户充值等功能,是一个包含社交功能的运动APP,市场上类似的项目有很多,如中羽联、趣运动、球长部落、互动吧等。

项目初始

最开始该项目发起人找到我的时候我还是一名在校的研究生,刚开始给他做的是一个微信公众号的小项目,主要是实现一个简单的赛事报名功能,不过毕竟H5实现的功能不如APP的功能强大,所以在完成这个项目后没多久,老板(下文中简称BOSS)就找到我给我说了他的一个手机APP开发的想法,期间不断的交流他的想法(主要是在做需求分析),而我需要做的就是把BOSS的想法进行评估,然后做出Demo展示,最后在春节前夕定下来了,准备做这么一个APP,其实我对IOS开发是零基础的,只是在以前大学的时候做过andriod的一个项目,不会object-c,不过通过自己学习了一些IOS相关的知识后就开始搭建项目工程了。

运动页

整个项目前期开发只有我和我一个同学,他负责开发IOS客户端,我负责写业务逻辑(包括服务器后台API接口,和IOS上的业务代码),到后期整个项目增加到了5人,有专职的UI以及Android开发。

项目架构

整个项目包含IOS客户端、Andriod客户端、API接口服务器,为了加速项目的开发速度,对于一些需求,如果有比较成熟的方案的话我们都会使用,比如项目中的IM功能,使用了融云IM来实现,当前还有其他的一些特性的开发也使用了第三方的组件,主要有微信SDK、ping++、百度地图等。接下来主要介绍的是API接口服务器端中使用的技术:

  • MySQL 数据库
  • ActiveMQ 消息队列
  • apidoc API接口文档生成
  • ThinkPHP PHP框架
  • xCache 缓存
  • Nginx Web服务器
  • workerman-statistics 分布式统计监控系统

ActiveMQ

Apache ActiveMQ是一个开源的消息队列,主要用于业务之间的解耦,例如用户注册后,向队列中发送一个任务,后台服务器进一步处理:申请融云用户Token值,下载用户授权的微信账号头像文件等,队列中的消息会被一个后台进行处理,每次处理的时候就直接从队列中获取一个任务按照如下流程进行处理
事件处理流程:

Created with Raphaël 2.1.0 开始 process 是否为真? 结束 error yes no

Tip:当process返回true的时候,将会把该事件消息从消息队列中移除

消息队列是一种很常用的解耦方式,能在系统中打通各个模块。

一些问题的解决

API接口安全

在开发整个项目过程中考虑到接口安全,需要对数据进行加密,一种方式是直接使用HTTPS来进行加密,这种方式是比较安全的,但是考虑到性能而且在整个过程中只需要对其中一些隐私数据进行加密传输,于是就采用了参数签名的方式来保证数据被篡改:

function getSign($param, $code, $sign_type = 'MD5'){//去除数组中的空值和签名参数(sign/sign_type)$param = self::paramFilter($param);//按键名升序排列数组$param = self::paramSort($param);//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串$param_str = self::createLinkstring($param);//把拼接后的字符串再与安全校验码直接连接起来$param_str = $param_str . $code;//创建签名字符串return self::createSign($param_str, $sign_type);}function createSign($param, $type = 'MD5'){$type = strtolower($type);if($type == 'md5'){return md5($param);}if ($type == 'sha1') {return sha1($param);}if($type == 'dsa'){exit('DSA 签名方法待后续开发,请先使用MD5签名方式');}exit("接口暂不支持" . $type . "类型的签名方式");}

将计算出来的sign作为一个参数发送往服务器,服务在收到请求后按照相同的规则将参数按照相同的参数进行计算得到sign_b,和参数中的sign进行比较,如果不一致则认为参数被篡改,丢弃该请求。

其他思考

虽然项目在开发中没有遇到大量用户的访问一些问题可能没有暴露出来,如高并发的访问如何保证服务的稳定可靠,但是在实际开发中都考虑了这些场景,如对经常从数据库中查询的记录都缓存在内存中,由于时间有限我这里就不展开讲了。

关于开源

由于现在工作原因,现在已经没有时间继续移动端的开发了,所以准备在之后一段时间内把代码整理好进行开源,毕竟项目没有成功,存在或多或少的问题,有技术上的,有项目规划上的。
https://github.com/zhujunxxxxx/SportsPage

项目截图

Figure 1. 运动列表

Figure 2. 运行页详情

Figure 3. 账户

Figure 4. 登录


<script type="math/tex" id="MathJax-Element-7"> </script>
Figure 5. 个人

记一次完整手机APP项目的开发相关推荐

  1. APP项目软件开发流程

    随着手机的普及,APP的开发也成为一个企业必须要做的工作,不管是iOS还是Android开发都遵循一定的程序流程,只有程序流程正确APP的开发才能有条不紊地进行.今天介绍下完整的app开发流程.北京木 ...

  2. 手机APP商城定制开发对于企业有哪些好处

    手机APP商城定制开发对于企业有哪些好处 以下是企业开发商城app好处,具体表现以下几个方面: 1.成本低:只要开发一个适合企业的app就可以了,相比电视.报纸甚至网络的推广方式都算低成本了. 2.企 ...

  3. 如何用天纵手机APP快速开发框架开发手机APP

    标题:如何用天纵手机APP快速开发框架开发手机APP 简介: 使用天纵软件快速开发平台开发手机APP不需要懂开发语言和进行编码工作,只需配置业务逻辑和界面样式即可.她颠覆了传统手机APP开发成本高.难 ...

  4. 手机app项目云服务器,手机app接入云服务器

    手机app接入云服务器 内容精选 换一换 SAP NetWeaver实例运行在弹性云服务器上.需要根据部署场景,创建一台或多台弹性云服务器.请参见方案介绍和数据规划章节,确定弹性云服务器数量及相关规划 ...

  5. andorid 手机APP应用程序开发介绍

    注意:此处的应用程序是一个app应用程序,而不是我们通常指的移动应用程序. 1.结束比较 本机应用 传统的本机应用程序开发模型中有两个主要系统,即iOS和Android,开发自己的应用程序需要使用每种 ...

  6. 手机APP移动应用开发

    "运筹软件"可以为各行业客户提供全平台的iOS APP开发.Android APP开发.手机软件开发,我们根据客户的实际情况与需求出发,以独到的设计理念和精工细作的专业精神.帮助各 ...

  7. APP项目的开发流程

    从事APP开发多年,对 APP 产品开发的流程已经再熟悉不过了,现在把这些年积累的一些经验和大家分享一下,一个产品是怎么从想法一步一步落地为具体成品的,这个过程中会经历一些怎样的必要流程呢?北京木奇移 ...

  8. 手机APP商城系统开发设计方案

    手机APP商城系统的设计问题在近几年逐渐被大家看中,这说明,手机电商行业开始迅速发展,并且被大家认可,电商企业大军由此诞生.那么新手们对手机APP商城系统的设计了解了多少呢?夏日葵电商与您分享:   ...

  9. 实战:移动APP项目产品开发流程详解

    问题补充:移动端APP产品的开发流程是如何的?开发移动端APP,从产品需求规划到最终上线发版,都有哪些必要流程,其中需要重点注意的事情有哪些,可以基于你当前的工作情况酌情回答. 黄沐秋Moon NBP ...

最新文章

  1. 工作报告总是写不好?表达不准确?试试这个写作方法
  2. 技术剖析 | Axonius为什么能获得 2019 RSAC创新大奖
  3. logback-spring.xml配置文件
  4. php 字符符转整数
  5. Python str 函数 - Python零基础入门教程
  6. init_cheap: VirtualAlloc pointer is null, Win32 error 487
  7. Python collections的使用
  8. 云知声今年要量产三款芯片,还公布了多模态AI芯片规划
  9. 魔兽世界暴雪隐藏密集
  10. 智能人物画像综合分析系统——Day3
  11. idea更新报Node remains in conflict冲突的解决办法
  12. CRM-如何获取客户
  13. Apache JMeter 5.1.1 Win 10 环境变量配置
  14. 内核层读写应用层文件,使用filp_open函数。
  15. 【数据结构和算法】基础之素数
  16. wcp知识库系统的安装
  17. 零基础自学R语言 1 R语言介绍 1.5 RStudio软件
  18. php有几个单词,PHP-如何选择一个句子的前10个单词?
  19. 工业智能网关BL110应用之九十六: 实现西门子S7-1500 PLC接入华为云平台
  20. Mybatis遍历Map集合(Java/Mybatis动态排序)

热门文章

  1. java数据类型(java数据类型有哪些)
  2. 数据安全--1--专栏开篇作-数据安全概念及架构
  3. vuex的state数据丢失
  4. 关于请求报文和响应报文的详解
  5. ASCII字符代码表
  6. 修改mac终端的前缀
  7. PNETLAB中可以导入的交换机、防火墙等设备镜像
  8. LIN总线协议详解10(LIN的API)
  9. 数字图像处理笔记(一)——图像存储空间,分辨率,图像内插
  10. 第四章 数据定义语言(Data Definition Language,DDL)