Spotify iOS フレームワークを使用すると、アプリケーションはユーザーのデバイスのバックグラウンドで実行されている Spotify アプリと対話できるようになります。機能には、認証、現在再生中のトラックとコンテキストのメタデータの取得、再生コマンドの発行が含まれます。
注意: Spotify 開発者ツールを使用すると、開発者利用規約に同意したことになります。
Spotify iOS SDK は、Spotify アプリに接続する軽量オブジェクトのセットで、再生に関する重労働をすべて Spotify アプリ自体にオフロードしながら、Spotify アプリを制御できるようにします。 Spotify アプリは再生、ネットワーク、オフライン キャッシュ、OS 音楽統合を処理するため、ユーザーはユーザー エクスペリエンスに集中できます。アプリから Spotify アプリへの移動、またはその逆の移動は、再生とメタデータが常に同期される合理化されたエクスペリエンスです。
主な特長
バグの報告
コンポーネント
アプリのリモート通話はどのように機能しますか?
利用規約
チュートリアル
よくある質問
開発者コミュニティからのフィードバックは大歓迎ですので、不足している機能やバグをお気軽に Issue Tracker に提出してください。新しい問題を作成する前に、必ず既存の問題を検索してください。
バグチケットを開く |オープンな機能リクエスト
Spotify iOS フレームワークには、iOS 12 以降の展開ターゲットが必要です。 SDK では次のアーキテクチャがサポートされています。
SPTAppRemoteAlbum
SPTAppRemoteArtist
SPTAppRemoteLibraryState
SPTAppRemotePlaybackRestrictions
SPTAppRemotePlaybackOptions
SPTAppRemotePlayerState
SPTAppRemoteTrack
SPTAppRemoteContentItem
SPTAppRemoteUserCapabilities
SPTAppRemoteImageRepresentable
SPTConfiguration
Spotify アプリに接続し、API コンポーネントを取得するためのメイン エントリ ポイント。これを使用して、接続を確立、監視、終了します。
次のような再生関連コマンドを送信します。
SPTAppRemoteImageRepresentable
の画像を取得する
次のようなユーザー関連データをフェッチ/サブスクライブ/設定します。
SPTAppRemoteUserCapabilities
のフェッチおよび/またはサブスクライブユーザーに推奨されるコンテンツを取得します。
App Remote API のいずれかを操作するときは、期待される結果項目または操作が失敗した場合のNSError
のいずれかで呼び出されるSPTAppRemoteCallback
ブロックを渡します。ブロックは、Spotify アプリがコマンドを受信した後 (または接続が確立できなかった場合) にトリガーされます。
SPTRemotePlayerAPI
使用して曲をスキップする例を次に示します。
[appRemote.playerAPI skipToNext: ^( id _Nullable result, NSError * _Nullable error) {
if (error) {
// Operation failed
} else {
// Operation succeeded
}
}];
iOS フレームワークの使用を開始するのに役立つサンプル プロジェクトが DemoProjects フォルダーにいくつか用意されています。各サンプルの機能の詳細については、DemoProjects フォルダーの Readme を参照してください。
Spotify アプリと通信するには、アプリケーションはまず、App Remote の組み込み認証を使用して、再生を制御するためのユーザーの許可を取得する必要があります。そのためには、Spotify に接続するときに認証ビューをリクエストする必要があります。フレームワークは自動的にapp-remote-control
スコープをリクエストし、ユーザーがまだ同意していない場合は認証ビューを表示します。
Spotify 開発者ツールを使用すると、開発者利用規約に同意したことになります。
このチュートリアルでは、Spotify iOS SDK を使用してオーディオ トラックを再生し、プレーヤーの状態をサブスクライブする簡単なアプリの作成を段階的に説明します。認証フローを順を追って説明します。
次の手順に従って、コーディングを開始する準備ができていることを確認してください。
SpotifyiOS パッケージをプロジェクトに追加します。これを行うには、Swift Package Manager (SPM) を使用するか、 SpotifyiOS.xcframework
Xcode プロジェクトに直接追加します。
info.plist に、My Applications に登録したリダイレクト URI を追加します。 「URL タイプ」と「URL スキーム」にリダイレクト URI を追加する必要があります。 「URL識別子」も必ず一意に設定してください。
ライブラリをソース ファイルに追加します。
迅速
import SpotifyiOS
目的-c
# import < SpotifyiOS/SpotifyiOS.h >
SDK の再生制御部分を使用できるようにするには、ユーザーはアプリケーションを認証する必要があります。そうでない場合、接続はNo token provided
エラーで失敗します。ユーザーがアプリを認証できるようにするには、組み込みの認証フローを使用できます。
クライアント ID とリダイレクト URI を使用してSPTConfiguration
初期化します。
迅速
let configuration = SPTConfiguration (
clientID : " YOUR_CLIENT_ID " ,
redirectURL : URL ( string : " your_redirect_uri " ) !
)
目的-c
SPTConfiguration *configuration = [[SPTConfiguration alloc ] initWithClientID: @" your_client_id "
redirectURL: [ NSURL URLWithString: @" your_redirect_uri " ]];
SPTConfiguration
を使用してSPTAppRemote
初期化します
迅速
self . appRemote = SPTAppRemote ( configuration : configuration , logLevel : . debug )
目的-c
self.appRemote = [[SPTAppRemote alloc ] initWithConfiguration: configuration logLevel: SPTAppRemoteLogLevelDebug];
認証フローを開始します (Spotify がインストールされているかどうかを検出する他の方法や、インストールの属性については、コンテンツ リンク ガイドを参照してください)。
迅速
// Note: A blank string will play the user's last song or pick a random one.
self . appRemote . authorizeAndPlayURI ( " spotify:track:69bp2EbF7Q2rqc5N3ylezZ " ) { spotifyInstalled in
if !spotifyInstalled {
/*
* The Spotify app is not installed.
* Use SKStoreProductViewController with [SPTAppRemote spotifyItunesItemIdentifier] to present the user
* with a way to install the Spotify app.
*/
}
}
目的-c
// Note: A blank string will play the user's last song or pick a random one.
[ self .appRemote authorizeAndPlayURI: @" spotify:track:69bp2EbF7Q2rqc5N3ylezZ " completionHandler: ^( BOOL spotifyInstalled) {
if (!spotifyInstalled) {
/*
* The Spotify app is not installed.
* Use SKStoreProductViewController with [SPTAppRemote spotifyItunesItemIdentifier] to present the user
* with a way to install the Spotify app.
*/
}
}];
application:openURL:options:
の accessToken を解析し、それをSPTAppRemote
connectionParameters に設定するようにAppDelegate
を構成します。
目的-c
- ( BOOL )application:(UIApplication *)app openURL:( NSURL *)url options:( NSDictionary <UIApplicationOpenURLOptionsKey, id > *)options
{
NSDictionary *params = [ self .appRemote authorizationParametersFromURL: url];
NSString *token = params[SPTAppRemoteAccessTokenKey];
if (token) {
self. appRemote . connectionParameters . accessToken = token;
} else if (params[SPTAppRemoteErrorDescriptionKey]) {
NSLog ( @" %@ " , params[SPTAppRemoteErrorDescriptionKey]);
}
return YES ;
}
UIScene を使用している場合は、シーン デリゲートで適切なメソッドを使用する必要があります。
迅速
func scene ( _ scene : UIScene , openURLContexts URLContexts : Set < UIOpenURLContext > ) {
guard let url = URLContexts . first ? . url else {
return
}
let parameters = appRemote . authorizationParameters ( from : url ) ;
if let access_token = parameters ? [ SPTAppRemoteAccessTokenKey ] {
appRemote . connectionParameters . accessToken = access_token
self . accessToken = access_token
} else if let error_description = parameters ? [ SPTAppRemoteErrorDescriptionKey ] {
// Show the error
}
}
接続デリゲートを設定し、接続を試みます。
迅速
self . appRemote . delegate = self
self . appRemote . connect ( )
// MARK: AppRemoteDelegate
func appRemoteDidEstablishConnection ( _ appRemote : SPTAppRemote ) {
// Connection was successful, you can begin issuing commands
}
func appRemote ( _ appRemote : SPTAppRemote , didFailConnectionAttemptWithError error : Error ? ) {
// Connection failed
}
func appRemote ( _ appRemote : SPTAppRemote , didDisconnectWithError error : Error ? ) {
// Connection disconnected
}
目的-c
self.appRemote.delegate = self;
[ self .appRemote connect ];
- ( void )appRemoteDidEstablishConnection:(SPTAppRemote *)appRemote
{
// Connection was successful, you can begin issuing commands
}
- ( void )appRemote:(SPTAppRemote *)appRemote didFailConnectionAttemptWithError:( NSError *)error
{
// Connection failed
}
- ( void )appRemote:(SPTAppRemote *)appRemote didDisconnectWithError:(nullable NSError *)error
{
// Connection disconnected
}
デリゲートを設定し、プレーヤーの状態をサブスクライブします。
迅速
self . appRemote . playerAPI ? . delegate = self
appRemote . playerAPI ? . subscribe ( toPlayerState : { result , error in
// Handle Errors
} )
// MARK: SPTAppRemotePlayerStateDelegate
func playerStateDidChange ( _ playerState : SPTAppRemotePlayerState ) {
print ( " track name ( playerState . track . name ) " )
}
目的-c
appRemote.playerAPI.delegate = self;
[appRemote.playerAPI subscribeToPlayerState: ^( id _Nullable result, NSError * _Nullable error) {
// Handle Errors
}];
- ( void )playerStateDidChange:( id <SPTAppRemotePlayerState>)playerState
{
NSLog ( @" Track name: %@ " , playerState. track . name );
}
礼儀として、アプリがバックグラウンド状態になったときは、常に App Remote を切断する必要があります。これにより、アクティブなストリームを無効にしても安全であることが Spotify に通知されます。アプリが適切に呼び出しを切断しない場合、Spotify は接続を維持すべきではないことを知る方法がなく、将来的に接続の問題が発生する可能性があります。
着信や Siri とのやり取りなどの中断イベントの後にアプリが自動的に再接続するようにしたい場合は、 willResignActive
コールバックとdidBecomeActive
コールバックを使用して、安全に切断して再接続することができます。直接再接続したくない場合は、通常、 didEnterBackground
コールバックで接続を閉じるだけで十分です。
迅速
func sceneWillResignActive ( _ scene : UIScene ) {
self . appRemote . disconnect ( )
}
func sceneDidBecomeActive ( _ scene : UIScene ) {
self . appRemote . connect ( )
}
目的-c
- ( void )applicationWillResignActive:(UIApplication *)application
{
[ self .appRemote disconnect ];
}
- ( void )applicationDidBecomeActive:(UIApplication *)application
{
[ self .appRemote connect ];
}
// If you're using UIWindowSceneDelegate
- ( void )sceneDidBecomeActive:(UIScene *)scene
{
[ self .appRemote connect ];
}
- ( void )sceneWillResignActive:(UIScene *)scene
{
[ self .appRemote disconnect ];
}
SPTAppRemote
に接続するために音楽を再生する必要があるのはなぜですか?
SPTAppRemote
に接続するときは、Spotify アプリがバックグラウンドで中断されないように、音楽が再生されている必要があります。 iOS アプリケーションは、ナビゲーションや音楽の再生などの操作をアクティブに実行していない限り、バックグラウンドでアクティブな状態を維持できるのは数秒だけです。
SpotifyiOS.framework のスレッドは安全ですか?
いいえ、フレームワークは現在メインスレッドから呼び出されることを想定しています。ほとんどの作業は内部的にバックグラウンド スレッドにオフロードされますが、コードへのコールバックもメイン スレッドで発生します。
再生を開始せずに認証する必要がある場合はどうすればよいですか?
別の認証方法もあります。詳細については、こちらをご覧ください。