WOZエンジニアの有吉です。
本日、日本上陸が発表された音楽ストリーミングサービスのSpotify。現時点でのサービスの利用は招待制となっており、Spotifyのウェブサイトから申請する必要があります。
Spotifyはデベロッパーに対してWeb APIやSDKを提供しています。Wozでは、以前Music Hack Dayで作成していただいたアカウントでサービスを使用することができました。そこで今回、早速Spotify DeveloperのiOS SDKのチュートリアルをやってみたので、その概要とSwift版のコードを公開したいと思います。公式で紹介されているコードはObjective-Cだったので、いつも使っているSwiftに書き直しました。
Web API
SpotifyはRESTに基づいたWeb APIを公開しています。Spotifyのカタログデータを取得したり、ユーザーのプレイリストを管理したりといったことができます。
ライブラリとしては、RubyやPythonなど主要言語のラッパーがあります。
iOS SDK
今回の記事で組み込むSDKです。以下のようなことができます。詳しくは公式のiOS SDKのページをご覧ください。
- ユーザー認証
- オーディオ再生とストリームの管理
- アートワークを含むメタデータ(アーティスト、アルバム、トラック)のルックアップ
- プレイリストの管理
- ユーザーのYour Musicライブラリの管理
現時点ではベータとなっています。前身のLibspotify SDKもありましたが、現在はiOS SDKを利用することが推奨されています。
チュートリアル
チュートリアルの内容
iOS SDKのBeginner’s Tutorialでは以下を学ぶことができます。
- Xcodeプロジェクトのセットアップ
- ユーザー認証
- オーディオストリームの再生(Spotify Premiumアカウントのみ)
チュートリアルでコードを書くのはAppDelegateだけで、UIの作成は不要です。
アプリケーション登録
Spotify DeveloperのMy Applicationsから、今回のサンプルアプリの名前を入力します。
Application NameとDescriptionを入力し、アプリケーションを作成します。
アプリが作成できたら、Client IDとClient Secretを控えます。
Redirect URIsやBundle IDsはiOS側の設定と合わせます。
※Client IDとClient Secretは伏せています
Xcodeプロジェクト設定
Info.plistのURL Typesで、Identifier とURL Schemesを設定します。
Githubのspotify/ios-sdkをダウンロードし、Spotify.frameworkをXcodeプロジェクトに追加します。(Carthageは未対応で、CocoaPodsで対応しているSDKは旧バージョンでした。)
Spotify.frameworkはObjective-Cで書かれているので、Bridging-Header を追加してフレームワークをインポートします。
コード
公式のサンプルをSwiftで書いたコードです。内容は基本的に同じです。
プロジェクトファイル一式はGithubに置きました。
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, SPTAudioStreamingDelegate { var window: UIWindow? let kClientId = "YOUR_CLIENT_ID" let kRedirectUrl = NSURL(string: "YOUR_REDIRECT_URL") var session: SPTSession? var player: SPTAudioStreamingController? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // set up Spotofy SPTAuth.defaultInstance().clientID = kClientId SPTAuth.defaultInstance().redirectURL = kRedirectUrl SPTAuth.defaultInstance().requestedScopes = [SPTAuthStreamingScope] as [AnyObject] let loginUrl = SPTAuth.defaultInstance().loginURL application.openURL(loginUrl) return true } // handle auth func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { if SPTAuth.defaultInstance().canHandleURL(url) { SPTAuth.defaultInstance().handleAuthCallbackWithTriggeredAuthURL(url, callback: { error, session in if error != nil { print("*** Auth error: \(error)") } // Call the -loginUsingSession: method to login SDK self.loginUsingSession(session) }) return true } return false } func loginUsingSession(session: SPTSession) { // Get the player Instance player = SPTAudioStreamingController.sharedInstance() if let player = player { player.delegate = self // start the player (will start a thread) try! player.startWithClientId(kClientId) // Login SDK before we can start playback player.loginWithAccessToken(session.accessToken) } } // MARK: SPTAudioStreamingDelegate. func audioStreamingDidLogin(audioStreaming: SPTAudioStreamingController!) { let urlStr = "spotify:track:6ZSvhLZRJredt15aJiBQqv" // track available in Japan player!.playSpotifyURI(urlStr, startingWithIndex: 0, startingWithPosition: 0, callback: { error in if error != nil { print("*** failed to play: \(error)") return } else { print("play") } }) } }
ちなみに公式サンプルで使われているトラックはおそらく日本では再生できないようなので、上記のサンプルコードでは別のトラックを指定しました。
実行
アプリ起動後、Safariが開き、アカウント接続を促すダイアログが表示されます。
OKを押すとアプリに戻り、楽曲が再生されます。
まとめ
ほぼ公式ページの手順通りに作業を進めて、Spotify SDKをSwiftのアプリで利用することができました。実際のアプリ開発ではさらに、ログインセッションの管理や、トラック情報の取得などの機能が必要になってくるでしょう。
他の大手音楽ストリーミングサービスと比較してSpotifyは情報がオープンで開発コミュニティも充実しており、今回のように公開APIを使うことが出来るのも音楽好きエンジニアにとっては嬉しいですね。ライバルであるApple MusicもAPIを公開しています。また記事を書きたいと思います。