標籤:gracenote ios sdk 音樂類服務
在需求徹底明朗化,外加從MusicFans轉到GraceNote,再從GraceNote的GNSDK轉到iOS SDK後,終於完成了在iOS上通過音樂的部分資訊擷取完整資訊的功能了。(好吧,我承認是相對完整。。。)
首先介紹下在項目中配置GraceNote的iOS SDK。
SDK的:Mobile Client
注意要先登入才能見到檔案的下載連結。另外官網還給出來一個SDK的配置文檔,完全跟著走在Xcode 5是走不通的,不過也具有一定的指導作用,建議看一看。
下載解壓後,建立一個工程,添加GracenoteMusicID.framework到工程中:
建立一個標頭檔GraceNote.h,匯入該架構中的標頭檔(在本工程中已經匯入全部需要使用到的標頭檔了):
#ifndef MFDemo_iOS_GraceNote_h#define MFDemo_iOS_GraceNote_h#import <GracenoteMusicID/GNConfig.h>#import <GracenoteMusicID/GNOperations.h>#import <GracenoteMusicID/GNSearchResultReady.h>#import <GracenoteMusicID/GNSearchResponse.h>#import <GracenoteMusicID/GNSearchResult.h>#import <GracenoteMusicID/GNImage.h>#import <GracenoteMusicID/GNCoverArt.h>#import <GracenoteMusicID/GNDescriptor.h>#endif
然後配置工程環境,依次在Build Phases中加入下列系統庫檔案:
配置完成。
其實這個SDK的使用非常的簡單。
第一步,通過你的GraceNote帳號配置GNConfig類(我直接放在了AppDelegate中,這樣可以配置可以全域使用):
#import <UIKit/UIKit.h>#import <GracenoteMusicID/GNConfig.h>@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property (retain, nonatomic) GNConfig *app_gnConfig;@end
#import "AppDelegate.h"static NSString * kClientID = @"4541440-79EFBF4E21724D084BA87FF9B242F0C9";static NSString * kCoverArtProperty = @"content.coverArt";static NSString * kCoverArtSizeProperty = @"content.coverArt.sizePreference";static NSString * kYESBooleanString = @"1";static NSString * kCoverArtSizeLarge = @"LARGE";static NSString * kCoverArtSizeThumbnail = @"THUMBNAIL";static NSString * kCoverArtSizeSmall = @"SMALL";@implementation AppDelegate@synthesize app_gnConfig = _app_gnConfig;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.app_gnConfig = [GNConfig init:kClientID]; // <Client ID>-<Client ID Tag> [_app_gnConfig setProperty:kCoverArtProperty value:kYESBooleanString]; [_app_gnConfig setProperty:kCoverArtSizeProperty value:kCoverArtSizeThumbnail]; return YES;}
client id就是申請應用時的ID,不清楚的可以參考Use GraceNote SDK in iOS(一)通過序列化的GDO查詢專輯封面。然後設定content.coverArt屬性開啟,否則返回的資料中將不會有專輯封面。
第二步,通過下面的方法發起查詢請求:
+ (void) searchByText:(id<GNSearchResultReady>)resultReady config:(GNConfig*)config artist:(NSString*)artist albumTitle:(NSString*)albumTitle trackTitle:(NSString*)trackTitle;
在Demo中,就是一個Button中的方法:
- (IBAction)check:(id)sender { [_checking_activityIndicator startAnimating]; self.view.alpha = 0.75; self.view.userInteractionEnabled = NO; [GNOperations searchByText:self config:((AppDelegate *)[[UIApplication sharedApplication] delegate]).app_gnConfig artist:_artist_textField.text albumTitle:_album_textField.text trackTitle:_trackTitle_textField.text];}
注意resultReady參數設定為一個遵守GNSearchResultReady協議的對象,也就是self。
config參數設定為全域的配置。
artist,albumTitle,trackTitle分別為藝術家,專輯名稱,音樂名等,這些是搜尋的Key,三個參數最多可以預設兩個。
第三步,在查詢成功後,我們可以從GNResultReady:方法中擷取伺服器返回的資料,從中剝離出我們需要的資訊。但是,非常奇怪的是,對於返回結果中的每一個GNSearchResponse對象,其AlbumCoverArt均為nil。如所示,注意是10個對象中的每一個對象的m_coverArt的值都是nil。
替代的方法是,記錄下GNSearchResponse對象的Id資訊,然後通過AlbumId發起二次請求,從伺服器中擷取完整的專輯資訊(這樣做確實不好,但是目前我只找到這個解決方案)
#pragma mark - GNSearchResultReady Protocol- (void)GNResultReady:(GNSearchResult *)result{ NSArray *responses = [result responses]; if (!responses || !responses.count) { [[[UIAlertView alloc] initWithTitle:@"對不起" message:@"沒有找到任何匹配結果" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; [_checking_activityIndicator stopAnimating]; self.view.userInteractionEnabled = YES; self.view.alpha = 1.0; _check_button.hidden = NO; return; } [_albumIDArray removeAllObjects]; int i = 0; for (GNSearchResponse *resp in responses) { if (i == 10) { break; } NSString *albumID = resp.albumId; if (albumID) { [_albumIDArray addObject:albumID]; i++; } } if (!_albumIDArray.count) { [[[UIAlertView alloc] initWithTitle:@"對不起" message:@"沒有找到任何匹配結果" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; return; } else { [self performSegueWithIdentifier:@"check_segue" sender:self]; [_checking_activityIndicator stopAnimating]; self.view.userInteractionEnabled = YES; self.view.alpha = 1.0; _check_button.hidden = NO; }}
在下一個視圖中通過AlbumID發起二次請求:
- (void)getAlbumLists { [_albumInfo removeAllObjects]; for (NSString *album_id in _albumIDs) { [GNOperations fetchByAlbumId:self config:((AppDelegate *)[[UIApplication sharedApplication] delegate]).app_gnConfig albumId:album_id]; }}
上幾張運行結果圖:
這個Demo通過音樂名/專輯名/藝術家擷取到專輯封面,歌曲風格,完整的歌曲名,完整的藝術家列表,歌曲風格,發行資訊等相對較為完整的資訊,重點是拿到了專輯的封面。真機調試過,沒什麼問題,看來我可以交差了。
完整的代碼我就不貼出來了,有興趣的下載Demo看看。
說明:由於GraceNote的SDK有71M,在Demo中我將其移除,因此Demo是無法啟動並執行。請自行到GraceNote網站中下載GraceNoteMusicID.framework並添加到工程中。