SpotifyAPI

SpotifyAPI

Swift库实现Spotify Web API全面功能集成

SpotifyAPI是一个Swift库,实现了Spotify Web API的完整功能集成。该库支持所有API端点,包括内容播放、播放列表创建和专辑检索等。通过使用Apple的Combine框架,SpotifyAPI简化了异步请求的处理过程。库提供三种授权方法,并具有自动刷新访问令牌的功能。SpotifyAPI支持iOS、macOS、tvOS、watchOS和Linux平台,为开发者提供了集成Spotify功能的便捷工具。

SpotifyAPISwift库Spotify Web API授权流程异步请求Github开源项目

SpotifyAPI

Spotify网络API的Swift库

特性

  • 支持所有的[Spotify网络API端点][24],包括播放内容、创建播放列表和获取专辑。
  • 使用Apple的Combine框架,使链接异步请求变得轻而易举
  • 支持三种不同的授权方法
  • 在必要时自动刷新访问令牌

阅读完整的[文档][1]并查看[这个示例iOS应用][14]和这个[示例命令行应用][23]。

赞助商

目录

支持的平台

  • Swift 5.6+
  • iOS 13+
  • macOS 10.15+
  • tvOS 13+
  • watchOS 6+
  • Linux

安装

  1. 在Xcode中,打开你想要添加此包的项目。
  2. 从菜单栏中,选择 文件 > Swift包 > 添加包依赖...
  3. 将此仓库的URL粘贴到搜索栏中。
  4. 选择SpotifyAPI库。
  5. 按照提示添加包。

快速入门

首先,前往[Spotify开发者仪表板][2]并创建一个应用。你将收到一个客户端ID和客户端密钥。然后,点击"编辑设置"并添加一个重定向URI。通常,这应该是一个重定向到你的应用中某个位置的自定义URL方案。不要在重定向URI的末尾添加斜杠

下一步是授权你的应用。无论是否需要[授权范围][5],对Spotify网络API的所有请求都需要授权。此库支持三种授权方法:

  • 带有授权码交换证明密钥的授权码流程:这是移动和桌面应用程序的最佳选择,因为在这些应用中存储客户端密钥是不安全的。与授权码流程相比,它提供了额外的安全层。如果你需要访问/修改用户数据,这需要[授权范围][5],请使用此方法。它要求用户在浏览器/网页视图中登录他们的Spotify账户并批准你的应用。在[Spotify网络API参考][15]中阅读更多内容。

  • 授权码流程:如果你需要访问/修改用户数据,这需要[授权范围][5],请使用此方法。它要求用户在浏览器/网页视图中登录他们的Spotify账户并批准你的应用。在[Spotify网络API参考][3]中阅读更多内容。

  • 客户端凭证流程:如果你不需要访问/修改用户数据,请使用此方法。换句话说,你无法访问需要[授权范围][5]或代表用户颁发的访问令牌的端点。这种方法的优势是它不需要任何用户交互。在[Spotify网络API参考][4]中阅读更多内容。

另请参阅[其他授权方法][25]。

在创建使用此库的应用程序时,你可能希望将授权信息保存到持久存储,这样用户就不必在每次应用程序退出并重新启动时都重新登录。有关如何执行此操作的指南,请参阅[将授权信息保存到持久存储][16]。

使用带有授权码交换证明密钥的授权码流程进行授权

创建一个SpotifyAPI实例,并将AuthorizationCodeFlowPKCEManager实例分配给authorizationManager属性:

import SpotifyWebAPI let spotify = SpotifyAPI( authorizationManager: AuthorizationCodeFlowPKCEManager( clientId: "你的客户端ID" ) )

在每次身份验证请求之前,你的应用应该生成一个代码验证器和一个代码挑战。代码验证器是一个长度在43到128个字符之间的加密随机字符串。它可以包含字母、数字、下划线、句点、连字符和波浪号。

为了生成代码挑战,你的应用应该使用SHA256算法对代码验证器进行哈希处理。然后,[base64url][19]编码你生成的哈希。不要包含任何=填充字符(无论是否进行百分比编码)。

你可以使用String.randomURLSafe(length:using:)String.randomURLSafe(length:)来生成代码验证器。你可以使用String.makeCodeChallenge(codeVerifier:)实例方法从代码验证器创建代码挑战。

例如:

let codeVerifier = String.randomURLSafe(length: 128) let codeChallenge = String.makeCodeChallenge(codeVerifier: codeVerifier) // 可选,但强烈推荐 let state = String.randomURLSafe(length: 128)

如果你使用自己的方法创建这些值,可以使用此[PKCE生成器工具][18]进行验证。另请参阅Data.base64URLEncodedString()String.urlSafeCharacters

接下来,创建将在浏览器(或网页视图)中打开的授权URL。打开时,它会向用户显示权限对话框。然后用户可以选择授权或拒绝授权你的应用程序。

let authorizationURL = spotify.authorizationManager.makeAuthorizationURL( redirectURI: URL(string: "你的重定向URI")!, codeChallenge: codeChallenge, state: state, scopes: [ .playlistModifyPrivate, .userModifyPlaybackState, .playlistReadCollaborative, .userReadPlaybackPosition ] )!

请参阅[makeAuthorizationURL(redirectURI:showDialog:codeChallenge:state:scopes:)][20]的完整文档。

重定向URI需要已在你使用[Spotify开发者仪表板][2]注册应用程序时指定的重定向URI白名单中输入。不要在重定向URI的末尾添加斜杠。

每个端点的文档列出了所需的[授权范围][5]。如果需要,你始终可以为不同的范围再次授权你的应用程序。然而,这不是一个累加过程。每次创建授权URL时,你必须指定所有需要的范围。

你可以决定如何打开URL。如果你正在创建iOS应用,最简单的方法是使用UIApplication.shared.open(authorizationURL)在浏览器中打开URL。

在用户批准或拒绝你的应用授权后,Spotify将重定向到你在创建授权URL时指定的重定向URI,并附加查询参数。将此URL传递给[requestAccessAndRefreshTokens(redirectURIWithQuery:codeVerifier:state:)][21]以请求访问和刷新令牌:

spotify.authorizationManager.requestAccessAndRefreshTokens( redirectURIWithQuery: url, // 必须与创建授权URL时用于生成代码挑战的代码验证器匹配。 codeVerifier: codeVerifier, // 必须与创建授权URL时使用的值匹配。 state: state ) .sink(receiveCompletion: { completion in switch completion { case .finished: print("成功授权") case .failure(let error): if let authError = error as? SpotifyAuthorizationError, authError.accessWasDenied { print("用户拒绝了授权请求") } else { print("无法授权应用程序:\(error)") } } }) .store(in: &cancellables)

一旦此发布者成功完成,你的应用程序就获得了授权,你可以开始向Spotify网络API发出请求。确保在进行另一次授权请求之前为状态参数、代码验证器和代码挑战生成新值。访问令牌将在必要时自动刷新。例如:

import SpotifyExampleContent let playbackRequest = PlaybackRequest( context: .uris( URIs.Tracks.array(.faces, .illWind, .fearless) ), offset: .uri(URIs.Tracks.fearless), positionMS: 50_000 ) spotify.play(playbackRequest) .sink(receiveCompletion: { completion in print(completion) }) .store(in: &cancellables)

所有端点的完整文档可以在[这里][8]找到。我们还建议你阅读[Spotify网络API参考][12]。

使用授权码流程进行授权

创建一个SpotifyAPI实例,并将AuthorizationCodeFlowManager实例分配给authorizationManager属性:

import SpotifyWebAPI let spotify = SpotifyAPI( authorizationManager: AuthorizationCodeFlowManager( clientId: "你的客户端ID", clientSecret: "你的客户端密钥" ) )

接下来,创建将在浏览器(或网页视图)中打开的授权URL。打开时,它会向用户显示权限对话框。用户可以选择授权或拒绝授权您的应用程序。

let authorizationURL = spotify.authorizationManager.makeAuthorizationURL( redirectURI: URL(string: "您的重定向URI")!, showDialog: false, scopes: [ .playlistModifyPrivate, .userModifyPlaybackState, .playlistReadCollaborative, .userReadPlaybackPosition ] )!

查看[makeAuthorizationURL(redirectURI:showDialog:state:scopes:)][6]的完整文档。

重定向URI需要已在您使用[Spotify开发者控制台][2]注册应用程序时指定的重定向URI白名单中输入。不要在重定向URI的末尾添加斜杠。

每个端点的文档列出了所需的[授权范围][5]。如果需要,您可以随时为不同的范围重新授权您的应用程序。但这不是累加过程。每次创建授权URL时,您必须指定所需的所有范围。

您可以决定如何打开URL。如果您正在创建iOS应用,最简单的方法是使用UIApplication.shared.open(authorizationURL)在浏览器中打开URL。

用户批准或拒绝您的应用程序的授权后,Spotify将重定向到您在创建授权URL时指定的重定向URI,并附加查询参数。将此url传入[requestAccessAndRefreshTokens(redirectURIWithQuery:state:)][7]以请求访问令牌和刷新令牌:

spotify.authorizationManager.requestAccessAndRefreshTokens( redirectURIWithQuery: url ) .sink(receiveCompletion: { completion in switch completion { case .finished: print("成功授权") case .failure(let error): if let authError = error as? SpotifyAuthorizationError, authError.accessWasDenied { print("用户拒绝了授权请求") } else { print("无法授权应用程序:\(error)") } } }) .store(in: &cancellables)

一旦此发布者成功完成,您的应用程序就获得授权,您可以开始向Spotify Web API发出请求。在进行另一个授权请求之前,请确保为状态参数生成新值。访问令牌将在必要时自动刷新。例如:

spotify.currentUserPlaylists() .extendPages(spotify) .sink( receiveCompletion: { completion in print(completion) }, receiveValue: { results in print(results) } ) .store(in: &cancellables)

此授权过程在这个[示例应用][22]中完全实现。所有端点的完整文档可以在[这里][8]找到。我们也鼓励您阅读[Spotify Web API参考][12]。

使用客户端凭证流进行授权

创建SpotifyAPI的实例,并将ClientCredentialsFlowManager的实例分配给authorizationManager属性:

import SpotifyWebAPI let spotify = SpotifyAPI( authorizationManager: ClientCredentialsFlowManager( clientId: "您的客户端ID", clientSecret: "您的客户端密钥" ) )

要授权您的应用程序,调用authorize()

spotify.authorizationManager.authorize() .sink(receiveCompletion: { completion in switch completion { case .finished: print("成功授权应用程序") case .failure(let error): print("无法授权应用程序:\(error)") } }) .store(in: &cancellables)

查看[authorize][13]的完整文档。

一旦此发布者成功完成,您的应用程序就获得授权,您可以开始向Spotify Web API发出请求。访问令牌将在必要时自动刷新。例如:

spotify.search(query: "Pink Floyd", categories: [.track]) .sink( receiveCompletion: { completion in print(completion) }, receiveValue: { results in print(results) } ) .store(in: &cancellables)

此授权过程在这个[示例命令行应用][23]中实现。所有端点的完整文档可以在[这里][8]找到。我们也鼓励您阅读[Spotify Web API参考][12]。

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多