Use GraceNote SDK in iOS(2)獲取音樂的完整信息

tags:    時間:2014-05-04 18:59:20
Use GraceNote SDK in iOS(二)獲取音樂的完整信息

在需求徹底明朗化,外加從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並添加到工程中。




推薦閱讀文章

Bookmark the permalink ,來源:互聯網