28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Spotify iOS SDKのチュートリアルをSwiftでやってみた

Last updated at Posted at 2016-09-29

本日、音楽ストリーミングSpotifyのサービスが日本でも使えるようになりました。
Spotifyはデベロッパーに対してWeb APIやSDKを提供しています。今回は早速Spotify DeveloperのiOS SDKのチュートリアルをやってみたので、その概要とSwift版のコードを公開したいと思います。

【追記】
本記事執筆時点では、Spotifyのサービスは招待制となっているようです。ハッカソン等で以前にSpotifyにアカウントを作成してもらっていた人はそのアカウントが使えるみたいです。

【追記2】
2016年11月10日に日本でもSpotifyが一般公開されました。

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側の設定と合わせます。

spotify_xcode_1_1.png

※Client IDとClient Secretは伏せています

Xcodeプロジェクト設定

Info.plistのURL Typesで、Identifier とURL Schemesを設定します。

spotify_xcode_1.png

Githubのspotify/ios-sdkをダウンロードし、Spotify.frameworkをXcodeプロジェクトに追加します。(Carthageは未対応で、CocoaPodsで対応しているSDKは旧バージョンでした。)

Spotify.frameworkはObjective-Cで書かれているので、Bridging-Header を追加してフレームワークをインポートします。

コード

公式のサンプルをSwiftで書いたコードです。内容は基本的に同じです。
プロジェクトファイル一式はGithubに置きました。

AppDelagate.swift
@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を公開しています。また機会があれば記事を書きたいと思います。

28
27
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?