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