在需求彻底明朗化,外加从MusicFans转到GraceNote,再从GraceNote的GNSDK转到iOS SDK后,最终完毕了在iOS上通过音乐的部分信息获取完整信息的功能了。(好吧,我承认是相对完整。。。)

首先介绍下在项目中配置GraceNote的iOS SDK。

SDK的下载地址:Mobile Client

注意要先登录才干见到文件的下载链接。另外官网还给出来一个SDK的配置文档,全然跟着走在Xcode 5是走不通的,只是也具有一定的指导作用,建议看一看。

下载解压后,新建一个project,加入GracenoteMusicID.framework到project中:

新建一个头文件GraceNote.h,导入该框架中的头文件(在本project中已经导入所有须要使用到的头文件了):

#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

然后配置project环境,依次在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:方法中获取server返回的数据,从中剥离出我们须要的信息。可是,很奇怪的是,对于返回结果中的每个GNSearchResponse对象,其AlbumCoverArt均为nil。例如以下图所看到的,注意是10个对象中的每个对象的m_coverArt的值都是nil。

替代的方法是,记录下GNSearchResponse对象的Id信息,然后通过AlbumId发起二次请求,从server中获取完整的专辑信息(这样做确实不好,可是眼下我仅仅找到这个解决方法)

#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并加入到project中。

Use GraceNote SDK in iOS(二)获取音乐的完整信息的更多相关文章

  1. Use GraceNote SDK in iOS(一)通过序列化GDO查询专辑封面

    于Use MusicBrainz in iOS之后,因为MusicBrainz找出专辑封面,它只能转移到其他网站提供的音乐信息搜索服务,领导给出GraceNote.(有压力.. .) 需求类似:通过一 ...

  2. ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值

    本文原创,转载请注明原创地址 http://blog.csdn.net/dongyu1009/article/details/37697389 用AGSImageServiceIdentifyTask ...

  3. Java并发学习之二——获取和设置线程信息

    本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息可以帮助我们辨别每个线程.知道它的一些信息 ID:每一个线程的独特标示: Name:线程的名称: Prio ...

  4. 利用php获取图片完整Exif信息类 获取图片详细完整信息类

    <?php /** * @Author: TonyLevid * @Copyright: TonyLevid.com * @Name: Image Exif Class * @Version: ...

  5. Use MusicBrainz in iOS(三)查询专辑的完整信息

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010962810/article/details/24066737 本文讨论下通过专辑名获取专辑的 ...

  6. iOS如何获取网络图片(二)

    ios如何获取图片(二)无沙盒下 解决问题 *解决问题1:tableView滑动卡顿,图片延时加载 解决方法:添加异步请求,在子线程里请求网络,在主线程刷新UI *解决问题2:反复请求网络图片,增加用 ...

  7. iOS - 音乐播放器之怎么获取音乐列表

    方法一: 这个方法是通过获取到沙盒路径,来得到音乐的路径(使用这个方法需要把音乐放进沙盒) NSFileManager *manager = [NSFileManager defaultManager ...

  8. iOS 7 SDK: 如何使用后台获取(Background Fetch)

    本文转载至 http://www.cocoachina.com/applenews/devnews/2013/1114/7350.html 本文主要教你如何使用iOS 7 SDK多任务处理API--B ...

  9. 使用GraceNote Web API发展Mac发现音乐信息的应用

    好久没有写博客,最近各种忙,特别忙里忙,今晚难得清闲.写最近完成下一个博客任务的摘要:使用GraceNote的Web API开发一个查询的音乐信息的应用,事实上,并在这些功能的前GraceNote S ...

随机推荐

  1. QT 强止杀进程

    bool KillProcess(QString ProcessName){  bool result = false; QString str1; HANDLE hSnapShot = Create ...

  2. Tomcat7 + JRebel6.3.0 + IntelliJ idea 热部署配置过程+错误分析

    以前使用Tomcat的时候直接就可以热部署,现在换了一个使用Spring框架的项目突然就不能热部署了. 网上说在tomcat里conf/context.xml中加入 <Context antiJ ...

  3. ORA-00845 Oracle 启不来修改 MEMORY_TARGET

    1.内存减小导致Oracle启动不了   Last login: Sun Nov  4 15:09:06 2012 from 192.168.5.222  [oracle@h1 ~]$ sqlplus ...

  4. Android图像篇

    Android的渲染分为2D渲染和3D渲染两种,当中2D渲染的引擎为Skia.3D渲染的引擎是OpenGL ES.眼下.Android支持OpenGL ES1.0和OpenGL ES 2.0两种标准. ...

  5. ThinkPHP - 缓存使用

    用法: 需要使用不同的缓存方式的时候 需要重新初始化,如果不初始化直接调用的话,则会按照系统配置自动初始化.初始化的返回值,可以直接操作缓存: $cache = cache(array('type'= ...

  6. 机器学习笔记(三)- from Andrew Ng的教学视频

    week four: Non-linear hypotheses:Neural Networks -->x1 and x2 x1 XNOR x2 ->a1->x1 and x2;a2 ...

  7. php下正则表达式整理

    一.正则表达式的历史背景 1,内容深厚的正则表达式 ^.+@.+\\..+$ 形式 字符串搜索与匹配的工具 2,应用范围 手机输入法 Windows文件搜索 linux 列出文件命令 网站用户注册,如 ...

  8. HDOJ1232 并查集

    所谓并查集 并:Union 查:Find 定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单 ...

  9. Solr4.7缓存技术

    磁盘IO往往是计算机系统响应速度的一个突出瓶颈,搜索引擎查询很平凡,减少搜索过程中的磁盘IO对提升搜索响应速度无疑有莫大的帮助,在solr中,提供自带的缓存机制.我们只需要在solrconfig.xm ...

  10. swift-数组array

    // Playground - noun: a place where people can play import UIKit //--------------------------------- ...