Use MusicBrainz in iOS(一)初步使用

最近比较忙,一些文章写到了印象笔记中去了,也确实没有什么拿得出手写上博客的,所以最近都没怎么写博客。

今天接到了一个任务,就是使用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到此为止,接下来会做稍微深层次的探索。博客会继续更新。



Use MusicBrainz in iOS(一)初步使用,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。