这是我复制Spotify的iOS应用程序过程主要部分的演练。 以下文章旨在作为一个建设性文章,说明应用程序的主要功能以及用于提高其可用性的性能技术。
依存关系
我对第三方库不是很感兴趣,在我的项目中,我总是尝试自己构建所有内容。 但是,在某些情况下,选择现有库可能是最佳选择,尤其是当您必须处理网络API和处理JSON请求/响应时。
- 播放列表:有时您需要一个橡皮擦
- 如何知道您是否已出现在Spotify自己的播放列表中
- 2017年5种最佳音乐流媒体服务
- Spotify的包装功能现已上线; Music Biz对Amazon Australia做出反应; Deezer来到Fitbit
- 嘿,Spotify。 您真的需要知道我的设备位置吗? 我只想听音乐。
该项目使用的堆栈本质上如下:
- Spotify的API
- Alamofire(HTTP网络库)
- SwiftyJSON(用于处理JSON数据的库)
建筑
MVC,MVVM,VIPER和许多其他:哪个最好? 关于什么是最佳体系结构有很多意见,对于这个项目,我决定采用Apple的MVC
模式。
让我们来看一个例子:

播放器
在整个应用程序中创建一个可忽略的,始终可见的播放器是主要功能之一。 我决定从Apple的WWDC18演讲“设计流体接口”中获得启发,并实现由内森·吉特(Nathan Gitter)创建的名为“奖励动量”的一种接口(来源:https://github.com/nathangitter/fluid-interfaces#rewarding-动量)
在开发过程中,我必须弄清楚如何忽略来自UIButton
任何触摸,因为播放器本身是带有GestureRecognizer
的自定义UIView
。 解决方案非常简单,您只需GestureRecognizerDelegate
与以下功能GestureRecognizerDelegate
:

音讯
要播放曲目,我要从GitHub上现有的API中获取可播放的音频URL。 我使用NodeJS
和ExpressJS
创建了一个服务器,该服务器使我能够根据轨道的ID来获取网址,并执行以下操作:
https://my-server.com/api?id=XOecYFlspHw
我现在唯一需要做的就是将URL传递到应用程序并通过AVFoundation
播放音频:
您可能已经注意到,我正在使用loadValuesAsynchronously
以避免每当我开始播放曲目时冻结任何UI。
结论
我当然很高兴建立这个项目,并且有机会测试以前从未使用过的新模式和过滤器。 构建此类项目还使您有机会增强技能并修复一些不良的代码习惯。 如果您有兴趣查看运行中的应用程序,请查看以下内容。 您可以在Twitter上找到我:andreatoso