最近比较忙,一些文章写到了印象笔记中去了,也确实没有什么拿得出手写上博客的,所以最近都没怎么写博客。
今天接到了一个任务,就是使用MusicBrainz获取音乐的完整信息。今天下来,简单搭建好了工程的环境,写了个最简单的Demo,其中遇到了不少的坑,现在总结下,让朋友们少走点弯路。
首先介绍下MusicBrainz,简单来说它就是一个数据库(或者说是音乐世界的百科全书),通过它可以根据音乐文件的一小段信息,如歌曲名,歌手和创作时间等零碎信息,从数据库中获取该歌曲的完整信息。
对于那些热爱音乐而又有点强迫症的用户是最适合不过的了。
由于任务只是在iOS上发起网络请求从MusicBrainz中获取数据,所以我直奔主题了。
1.Clone MusicBrainz-objc from GitHub
从GitHub上下载MusicBrainz-objc的第三方类库,注意一定要Clone(原因下面说明),不能简单地Download ZIP:
也可以直接用命令git clone,只要不是简单的Download ZIP就行了。
2.Create static library and headers
打开工程,选择libmusicbrainz-iphoneos的scheme,Build工程。
如果该文件来自于Download ZIP,由于没有git文件,所以运行shell script时会报错,也无法加载submodules。
如果之前已经运行过了,建议通过Command + Shift + K,Clean一下已经生成的文件。
在Products下通过Show in Finder打开生成的文件路径:
3.Add library to project
新建一个工程MusicBrainzDemo,将Debug-iphoneos或Debug-iphonesimulator中生成的静态库文件和头文件复制到该工程的MusicBrainzDemo文件夹中。
注意一定要将Headers和.a文件放进MusicBrainzDemo / MusicBrainzDemo目录中,否则要在Build Settings下另外设置类库的查找路径。
接着添加以上文件到工程中。
4.Build Settings
打开MusicBrainzDemo工程,打开Build Settings选项,搜索Header Search Paths,添加一项:$(SDKROOT)/usr/include/libxml2,目的是给出libxml2这个动态库的头文件搜索路径。
如下图:
由于MusicBrainz类库还用到了自行创建的Category,所以还要在Other Linker Flags中添加-all_load选项。否则会报错。
5.Build Phases
打开Build Phases选项,添加以下类库:
经过以上步骤,类库在工程中就配置好了,有点麻烦,CocoaPods也不支持该类库(该项目最近一次更新在两年前,现在都来到了iOS 7的年代,原来的工程还停留在iOS 5,如果按MusicBrainz在GitHub上的指导还需要iphone simulator 5.1,实在太麻烦。挺大的一个坑,所以这里我直接按照自己的思路配置项目)。
6.Code and Test
添加代码,测试一下。关于MusicBrainz-iOS类库中的API详见其文档。
代码如下:
#import "ViewController.h" #import "MB.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; MBConnection *conn = [MBConnection connection]; MBRequest *req = [MBRequest lookupWithEntity:MBEntityArtist mbid:@"86119d30-d930-4e65-a97a-e31e22388166" incParameters:(MBIncParameterArtistRels | MBIncParameterReleaseGroups)]; void (^successBlock)(MBRequest *, MBMetadata *) = ^(MBRequest *request, MBMetadata *metadata) { NSLog(@"%@", metadata.Artist.Name); NSLog(@"success"); }; void (^failureBlock)(MBRequest *, NSError *, NSData *) = ^(MBRequest *request, NSError *error, NSData *data) { NSLog(@"Error for %@", error); }; [conn enqueueRequest:req onSuccess:successBlock onFailure:failureBlock]; } @end
运行后控制台输出如下:
2014-04-10 02:00:46.632 MusicBrainzDemo[16273:60b] -[MBConnection enqueueRequest:onSuccess:onFailure:] [Line 120] method => Thursday, April 10, 2014 at 2:00:46 AM China Standard Time Request ------- curl -X GET -H "Accept-Language: en, fr, de, zh-Hans, zh-Hant, ja, nl, it, es, es-MX, ko, pt, pt-PT, da, fi, nb, sv, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, en-AU, ca, hu, vi, en-us" -H "User-Agent: libmusicbrainz-objc-faf64ac" "http://musicbrainz.org:80/ws/2/artist/86119d30-d930-4e65-a97a-e31e22388166/?client=libmusicbrainz-objc-test&inc=release-groups%2Bartist-rels&limit=25&offset=0" 2014-04-10 02:00:46.637 MusicBrainzDemo[16273:60b] -[MKNetworkEngine reachabilityChanged:] [Line 194] Server [musicbrainz.org] is reachable via Wifi 2014-04-10 02:00:49.781 MusicBrainzDemo[16273:60b] 陳奕迅 2014-04-10 02:00:49.781 MusicBrainzDemo[16273:60b] success
这段代码的功能是通过一个MBID从MusicBrainz数据库中获取艺术家信息,也就是陈奕迅(歌神啊)。
初步的配置和简单的测试Demo到此为止,接下来会做稍微深层次的探索。博客会继续更新。