最近比較忙,一些文章寫到了印象筆記中去了,也確實沒有什麼拿得出手寫上博客的,所以最近都沒怎麼寫博客。
今天接到了一個任務,就是使用MusicBrainz獲取音樂的完整信息。今天下來,簡單搭建好了工程的環境,寫了個最簡單的Demo,其中遇到了不少的坑,現在總結下,讓朋友們少走點彎路。
首先介紹下MusicBrainz,簡單來說它就是一個數據庫(或者說是音樂世界的百科全書),通過它可以根據音樂文件的一小段信息,如歌曲名,歌手和創作時間等零碎信息,從數據庫中獲取該歌曲的完整信息。
對於那些熱愛音樂而又有點強迫症的用戶是最適合不過的了。
由於任務只是在iOS上發起網絡請求從MusicBrainz中獲取數據,所以我直奔主題了。
從GitHub上下載MusicBrainz-objc的第三方類庫,注意一定要Clone(原因下面說明),不能簡單地Download ZIP:
也可以直接用命令git clone,只要不是簡單的Download ZIP就行了。
打開工程,選擇libmusicbrainz-iphoneos的scheme,Build工程。
如果該文件來自於Download ZIP,由於沒有git文件,所以運行shell script時會報錯,也無法加載submodules。
如果之前已經運行過了,建議通過Command + Shift + K,Clean一下已經生成的文件。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20140410/2014041009314117.png" alt="\">
在Products下通過Show in Finder打開生成的文件路徑:
新建一個工程MusicBrainzDemo,將Debug-iphoneos或Debug-iphonesimulator中生成的靜態庫文件和頭文件復制到該工程的MusicBrainzDemo文件夾中。
注意一定要將Headers和.a文件放進MusicBrainzDemo / MusicBrainzDemo目錄中,否則要在Build Settings下另外設置類庫的查找路徑。
接著添加以上文件到工程中。
打開MusicBrainzDemo工程,打開Build Settings選項,搜索Header Search Paths,添加一項:$(SDKROOT)/usr/include/libxml2,目的是給出libxml2這個動態庫的頭文件搜索路徑。
如下圖:
由於MusicBrainz類庫還用到了自行創建的Category,所以還要在Other Linker Flags中添加-all_load選項。否則會報錯。
打開Build Phases選項,添加以下類庫:
經過以上步驟,類庫在工程中就配置好了,有點麻煩,CocoaPods也不支持該類庫(該項目最近一次更新在兩年前,現在都來到了iOS 7的年代,原來的工程還停留在iOS 5,如果按MusicBrainz在GitHub上的指導還需要iphone simulator 5.1,實在太麻煩。挺大的一個坑,所以這裡我直接按照自己的思路配置項目)。
添加代碼,測試一下。關於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
初步的配置和簡單的測試Demo到此為止,接下來會做稍微深層次的探索。博客會繼續更新。