我如何复制Spotify

这是我复制SpotifyiOS应用程序过程主要部分的演练。 以下文章旨在作为一个建设性文章,说明应用程序的主要功能以及用于提高其可用性的性能技术。

依存关系

我对第三方库不是很感兴趣,在我的项目中,我总是尝试自己构建所有内容。 但是,在某些情况下,选择现有库可能是最佳选择,尤其是当您必须处理网络API和处理JSON请求/响应时。

该项目使用的堆栈本质上如下:

  • 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。 我使用NodeJSExpressJS创建了一个服务器,该服务器使我能够根据轨道的ID来获取网址,并执行以下操作:

  https://my-server.com/api?id=XOecYFlspHw 

我现在唯一需要做的就是将URL传递到应用程序并通过AVFoundation播放音频:

您可能已经注意到,我正在使用loadValuesAsynchronously以避免每当我开始播放曲目时冻结任何UI。

结论

我当然很高兴建立这个项目,并且有机会测试以前从未使用过的新模式和过滤器。 构建此类项目还使您有机会增强技能并修复一些不良的代码习惯。 如果您有兴趣查看运行中的应用程序,请查看以下内容。 您可以在Twitter上找到我:andreatoso