大家好 , 我是LEE. 一名有信仰的果粉Coder.
非常感谢大家利用自己宝贵的时间来阅读我的文章 , 我并非大神 , 只是一枚努力成为大神的猿. 这篇文章主要写一个iOS系统下的音乐播放器 , 我会一步一步的去完成这个播放器的开发 , 并且会分析一些主要的技术点以及注意事项等 . 如果你是一个小白初学者 , 希望你看完后能够对你的提升有所帮助 , 如果你是一个老司机 , 希望可以得到你的指点 , 有任何不妥的地方 欢迎指正 , 我会认真改正 . 那么.. 开车了~
概述
明确一下我们都要做些什么:
我们主要以开发核心功能为主 , 附带几个额外的功能开发辅助演示 , 这里我选择5个扩展功能帮助演示这个Demo
1. 我的歌曲功能 包括收藏歌曲 全部歌曲 最近播放等
2. 设置功能 (在QQ音乐app中挑选一些有代表性的设置功能 比如主题颜色设置 , 流畅度设置 , 边听边存 , 音乐品质设置等)
3. 下载缓存功能
4. 收藏 , 喜欢 功能
5. 分享功能
文章'主线'自然是一步一步的去按照功能开发 , 其中涉及到一些控件或者工具类和独立模块的封装 我会单独开一个'分支'文章去讲解 , 这样不仅可以避免打乱'主线'流程 , 也可以让大家在阅读的时候有选择性的去看.
思路
首先,我们要明确一点,思路的重要性. 我们在做一个功能的开发或一个项目的开发时 , 首先要做的并不是提笔就写 抬手就敲, 而是分析我们要做的是什么事,怎么样才能做到. 在做之前进行一系列的分析与思考, 从而构建出一个可行的思路,最后才是去做. 也就是说只有先知道了怎么做! 然后是才能去做!
设计
接下来我们谈一谈设计, 思路有了以后 还需要我们去认真的设计、完善我们的思路 , 最终形成一个完美的可靠的方案 , 我们之后只要围绕着这个方案一步一步去做 , 就一定会得到我们想要的结果 .
设计这个东西不光是和经验有关 , 当然经验多的人可能会少走些弯路 , 但绝对和态度分不开 , 设计的好坏直接决定你的代码质量以及可扩展性、易维护性等方方面面的东西 , 好的设计并不是说人家技术多牛* 人家脑袋多聪明 , 而是人家真的用心在思考 . 没错 良好的设计需要我们用心的思考 认真的态度决定着你的代码是否设计的足够合理 , 质量是否可靠 .
好了 , 说了这么多 其实我想表达的就是 动手前 一定要去想好怎么去做 多列出几种方案 , 分析对比优势劣势 , 最后综合比对 选出一个最适合当前情况使用的方案去做 , 正所谓三思而后行.
不扯大道理了 , 我们回到开发中 .
首先 , 我们在开发前要思考一下 , 我们要做的是音乐播放器 , 那么音乐播放器APP的主要功能是什么? 没错 , 播放音乐 , 那么如何在iOS设备上播放我们的音乐呢?
在iOS中音频播放从形式上可以分为音效播放和音乐播放。前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度、循环等控制。后者指的是一些较长的音频,通常是主音频,对于这些音频的播放通常需要进行精确的控制。在iOS中播放两类音频分别使用AudioToolbox.framework
和AVFoundation.framework
来完成音效和音乐播放。
看到这里 你应该知道了我们要用什么去实现我们的音乐播放了 , 那么我们具体怎样使用这个AVFoundation.framework
呢? 后面开发的时候我会详细讲解 . 这里我们只要清楚我们要用到的东西就可以了.
继续我们的思考 , 既然已经知道用什么框架去播放音乐了 , 那么我们是不是要管理这个播放的音乐呢 , 控制他的开始、停止、进度等等 . 这就说明我们还需要一个管理的类 , 来控制播放的音乐 , 大家想一想 这个负责管理音乐播放的类怎样才能符合我们的需求 , 我们平时用到的音乐APP听歌时 , 不管我们跳转到哪个视图控制器 是不是音乐都依旧正常播放? 这说明什么? 说明播放音乐的类不属于任何视图控制器 他是独立的 , 那么我们有没有发现 一个音乐APP 可能有多个界面都可以控制音乐的播放 暂停等 , 这也就说明 多个界面调用的是同一个控制音乐播放的类 . 综合以上几点的分析 , 我们可以确定 我们要用到的是一个单例管理类 , 这样全局只存在一个这样的类 , 所有界面都调用这一个类去控制音乐播放 .
现在我们知道怎么做到控制一首歌曲的播放了 , 但 如果要实现多首歌曲的切换呢? 这样我们还需要一个管理类 去管理该播放哪一首歌曲 , 上一首是什么歌曲 下一首是什么歌曲 . 我们给这样的类起个名字 , 叫做播放队列管理类 , 总结一下 , 我们现在所分析出来的结果 : 要在iOS中实现播放音乐的功能 我们需要用到AVFoundation.framework
框架 , 想要控制播放的歌曲 我们需要一个播放管理类 , 想要控制播放哪些歌曲 实现上一首 下一首的功能 , 我们还需要一个播放队列管理类 去管理多个歌曲 . 到这里 我们已经分析完了一个音乐播放器APP的核心功能都需要什么来实现了.
其实可想而知 , 无论你怎么做这个音乐播放器 , 都离不开这2个核心类 . 看到这里如果你有什么不明白的 可以在下面留言 , 这里强调一点 , 不要把控制播放的这些代码写在播放页面里 或者 写在什么视图控制器里 , 能独立出来的一定要独立出来 , 能封装出来的 绝对不和其他代码放在一起 . 这是我的编码原则 , 我个人认为分成一份份的代码永远比一大坨强 , 无论是复用性 还是 可读性.
下面我画了一个示意图来表示 这2个核心管理类与其他界面的关系 (用我初学iOS时写的一个QQ音乐播放器界面当素材)
通过示意图 我们可以看出 , 各个界面都围绕这两个核心类展开各种功能的执行 , 结构非常清晰 , 每个模块间的执行流程一目了然 , 看到这里是不是刚开始的一头雾水全部都不见了?
好了 今天先说到这里 下一篇我们开始着手项目工程以及框架的搭建 See you later!
__总结 : 当我们准备要开发一个项目或者一个功能时 一定不要盲目的去写 , 先思考 先分析 , 找出其中不容易被发现细节 从各个方面去考虑 可能出现的不同情况 针对这些情况去设计一个有效可靠的方案 , 这样你就会朝着一个无比正确的方向前进. __