精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用jQM、HTML5和iOS SDK構建MusicBrainz應用程序

譯文
移動開發 iOS
MusicBrainz是自由音樂數據庫,原初創始目的系針對CDDB中的限制,但如今已不再將目標局限于CD后設資料儲存庫,而擴大為一種結構化的“音樂維基百科”。本教程將用到jQuery Mobile(簡稱“jQM”)、HTML5、PugPig框架和iOS SDK(開發工具包),用MusicBrainz應用編程接口(API)來構建一個應用程序。

【51CTO獨家譯文】隨著iPad和各種Android平板電腦紛紛推出,雜志式樣的應用程序變得極其流行起來。其中最有名的幾款應用程序包括面向iOS的FlipBoard、面向Android的Zinio以及面向iOS和Android的Pulse。人們對能夠提供雜志排版功能的工具的需求同樣很大。一些大受歡迎的工具包括FlipBoard(通過RSS/Twitter導入)、OnSwipePugPig。PugPig是一款開源HTML5排版平臺,讓我們可以為iPad、iPhone和安卓平臺制作漂亮的報紙、雜志和圖書。本教程將使用面向Xcode 4.2的PugPig框架插件,制作HTML5雜志。

雜志的設計將基于jQuery Mobile,不過另一個同樣出色的選擇是使用Magazine Grid,這是個超現代的CSS框架。我們在本教程中選用了jQuery Mobile,因為它為移動Web應用程序提供了豐富的窗口組件和出色的頁面轉場工作流程。

Magazine的內容將來源于MusicBrainz(開放音樂維基百科)。我們會使用jQuery用戶界面,為流行歌手構建離線的HTML頁面。我們從SongKick.com隨機挑選了20位流行歌手。

MusicBrainz API的介紹

MusicBrainz網站提供了門類齊全的音樂數據,包括歌手信息和發行的最新專輯等內容,還有每張專輯上所有歌曲音軌的完整的詳細資料。它旨在成為一個開放的音樂維基百科,考慮到Last.fm、GrooveShark、Pandora和Echonest等音樂服務網站使用來自MusicBrainz的數據,它必須做好這項工作。MusicBrainz通過以下兩個途徑將這些數據提供給社區:

MusicBrainz數據庫

MusicBrainz Web服務

我們將使用下列Web服務,從MusicBrainz提供豐富的歌手信息:

歌手信息

歌手專輯

歌手關系

歌手信息

MusicBrainz里面的歌手信息包括歌手的姓名、出生和死亡日期、國籍、性別、別名和歌手類型(單人還是樂隊)。為了本文中應用程序的需要,我們以Lady Gaga作為示例的歌手。Lady Gaga的MusicBrainz頁面是http://musicbrainz.org/artist/650e7db6-b795-4eb5-a702-5ea2fc46c848,其中650e7db6-b795-4eb5-a702-5ea2fc46c848是獨一無二的歌手編號(像Last.fm這些其他的第三方音樂網站也要引用該編號)。

[[55085]]

如下面的屏幕截圖所示,我們關注的信息基本上都在右邊這一欄(歌手信息、標簽和外部鏈接)以及下個一章節描述的第二個選項卡“Release”(專輯)。

Lady Gaga的MusicBrainz歌手信息截屏

點擊查看大圖

歌手專輯

歌手的發行專輯囊括了該歌手發行的所有專輯,無論是熱門單曲還是樂隊合唱曲目。它還包括發行日期、唱片公司、甚至還有條形碼。就跟以前一樣,專輯的編號也是獨一無二的。這個專輯編號可以用來從專輯獲取進一步的信息,包括音軌列表(歌曲)。

Lady Gaga的MusicBrainz歌手專輯截屏

點擊查看大圖

歌手關系

歌手關系定義了一名歌手與其他歌手之間的關系。

同樣,可以通過API調用來獲取與專輯和音軌有關的類似專輯和音軌。

我們感興趣的是Artist Relation(歌手關系)這個屬性,尤其是與“Url”這個子屬性之間的關系,它列出了維基百科、IMDB、推特、MySpace和Youtube等不同社交網站和音樂網站上的歌手Url。

粗粗瀏覽了MusicBrainz Web服務API后,我們可以進一步構建我們的Magazine App了。

【51CTO譯稿,非經授權謝絕轉載,合作媒體轉載請注明原文出處、作者及51CTO譯者!】#p#

第一步:使用Xcode構建PugPig應用程序

你從PugPig網站下載了Pugpig Xcode模板后,雙擊程序包,即可將模板安裝在Xcode里面。打開Xcode,選擇PugPig模板,即可開始創建一個新的項目,如下圖所示:

打開Xcode 選擇PugPig模板

點擊查看大圖

將它命名為“MusicBrainz – Magazine”,完成這個過程。在你的項目目錄中,創建一個名為“Data”的文件夾,并把它添加到你的項目中,PugPig要在這個文件夾里面尋找要呈現的HTML文件。你的項目現在看起來應該這樣:

新建項目

點擊查看大圖

現在,我們為這個數據文件夾添加index.html,那樣我們的雜志應用程序就有了一個起始點。我們在此使用了jQuery Mobile的默認設計,顯示可以搜索的Popular Artists(流行歌手)列表。在index.html文件中,添加下列代碼,一并添加jQuery Mobile框架和jQuery JavaScript庫。

  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <meta name="viewport" content="width=device-width, initial-scale=1">  
  6.         <title>MusicBrainz - Magazine</title>  
  7.         <link rel="stylesheet" href="jquery.mobile-1.0/jquery.mobile-1.0.css" />  
  8.         <script src="jquery-1.7.js"></script>  
  9.         <script src="jquery.mobile-1.0/jquery.mobile-1.0.js"></script>  
  10.     </head>  
  11.     <body>   
  12.    
  13.         <div data-role="page" class="type-interior">  
  14.    
  15.             <div data-role="header" data-theme="b">  
  16.                 <h1>Popular Artists</h1>  
  17.                 <a href="#" data-icon="home" data-iconpos="notext" data-direction="reverse" class="ui-btn-right jqm-home">Home</a>  
  18.             </div><!-- /header --> 
  19.    
  20.             <script type="text/javascript">  
  21.                 var admob_vars = {  
  22.                     pubid: 'a14e4b353ccfa57'// publisher id  
  23.                     bgcolor: '356FA8'// background color (hex)  
  24.                     text: 'FFFFFF'// font-color (hex)  
  25.                     test: false // test mode, set to false to receive live ads  
  26.                 };  
  27.                 </script>  
  28.             <script type="text/javascript" src="http://mmv.admob.com/static/iphone/iadmob.js"></script>  
  29.    
  30.             <div data-role="content">  
  31.                 <div class="content-primary">  
  32.                     <ul data-role="listview" data-filter="true">  
  33.                         <li><a href="650e7db6-b795-4eb5-a702-5ea2fc46c848.html">Lady Gaga</a></li>  
  34.                         <li><a href="cc197bad-dc9c-440d-a5b5-d52ba2e14234.html">Coldplay</a></li>  
  35.                         <li><a href="73e5e69d-3554-40d8-8516-00cb38737a1c.html">Rihanna</a></li>  
  36.                         <li><a href="122d63fc-8671-43e4-9752-34e846d62a9c.html">Katy Perry</a></li>  
  37.                         <li><a href="f82bcf78-5b69-4622-a5ef-73800768d9ac.html">Jay-Z</a></li>  
  38.                         <li><a href="d5be5333-4171-427e-8e12-732087c6b78e.html">Black Eyed Peas</a></li>  
  39.                         <li><a href="20244d07-534f-4eff-b4d4-930878889970.html">Taylor Swift</a></li>  
  40.                         <li><a href="eeb1195b-f213-4ce1-b28c-8565211f8e43.html">Guns N' Roses</a></li>  
  41.                         <li><a href="e21857d5-3256-4547-afb3-4b6ded592596.html">Gorillaz</a></li>  
  42.                         <li><a href="72c536dc-7137-4477-a521-567eeb840fa8.html">Bob Dylan</a></li>  
  43.                         <li><a href="65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab.html">Metallica</a></li>  
  44.                         <li><a href="45a663b5-b1cb-4a91-bff6-2bef7bbfdd76.html">Britney Spears</a></li>  
  45.                         <li><a href="f5dfa020-ad69-41cd-b3d4-fd7af0414e94.html">Wiz Khalifa</a></li>  
  46.                         <li><a href="ada7a83c-e3e1-40f1-93f9-3e73dbc9298a.html">Arctic Monkeys</a></li>  
  47.                         <li><a href="e0140a67-e4d1-4f13-8a01-364355bee46e.html">Justin Bieber</a></li>  
  48.                         <li><a href="3d2b98e5-556f-4451-a3ff-c50ea18d57cb.html">Aerosmith</a></li>  
  49.                         <li><a href="0103c1cc-4a09-4a5d-a344-56ad99a77193.html">Avril Lavigne</a></li>  
  50.                         <li><a href="d8354b38-e942-4c89-ba93-29323432abc3.html">30 Seconds to Mars</a></li>  
  51.                         <li><a href="d262ea27-3ffe-40f7-b922-85c42d625e67.html">PitBull</a></li>  
  52.                         <li><a href="35f866dc-c061-48ba-8157-cf2e0eac4857.html">Enrique Iglesias</a></li>  
  53.                     </ul>  
  54.                 </div><!--/content-primary --> 
  55.             </div><!-- /content --> 
  56.    
  57.             <div data-role="footer" class="footer-docs" data-theme="b">  
  58.                 <h2>Data from MusicBrainz.org</h2>  
  59.             </div>  
  60.        </div><!-- /page --> 
  61.     </body>  
  62. </html> 

現在運行Xcode項目,即可得到下列結果:

運行Xcode項目 即可得到本結果

點擊查看大圖

快速連按兩下應用程序。它應該會在靠近頁面腳注的某個地方,顯示一個小窗口,讓你可以瀏覽其他頁面(Data文件夾中的.html文件),就像雜志那樣!

雜志樣式

點擊查看大圖

【51CTO譯稿,非經授權謝絕轉載,合作媒體轉載請注明原文出處、作者及51CTO譯者!】#p#

第二步:使用PHP和MusicBrainz Web服務創建HTML頁面

到目前為止,我們見到了如何為我們的Magazine App創建index.html頁面,現在可以看一下如何構建歌手詳細資料頁面,并將它們作為.html文件保存在數據文件夾中。

我們會使用PHP及其XML解析庫SimpleXml來解析MusicBrainz Web服務調用。在此之前,我們將使用jQuery Mobile頁面布局和CSS來構建一個簡單的歌手詳細資料頁面模板。我們還把占位符放在模板中,之后占位符將換成從MusicBrainz Web服務獲取的實際結果,于是我們使用這個帶有歌手數據的頁面模板,創建了最終的歌手詳細資料頁面,并將它保存在磁盤上。下面是歌手模板:

  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"  />  
  6.             <meta name="viewport" content="width=device-width, initial-scale=1">  
  7.                 <title>{ARTIST_NAME}</title>  
  8.                 <link rel="stylesheet" href="jquery.mobile-1.0/jquery.mobile-1.0.css" />  
  9.                 <script src="jquery-1.7.js"></script>  
  10.                 <script src="jquery.mobile-1.0/jquery.mobile-1.0.js"></script>  
  11.     </head>  
  12.     <body>   
  13.    
  14.     <div data-role="page" class="type-interior">  
  15.             <div data-role="header" data-theme="b">  
  16.                 <a href="index.html" data-icon="back" data-iconpos="back" class="ui-btn-left jqm-home">Back</a>  
  17.                 <h1>{ARTIST_NAME}</h1>  
  18.                 <a href="#" data-icon="home" data-iconpos="notext" data-direction="reverse" class="ui-btn-right jqm-home">Home</a>  
  19.    
  20.             </div><!-- /header --> 
  21.    
  22.             <div data-role="content">  
  23.                 <div class="content-primary">  
  24.                 <script type="text/javascript">  
  25.                     var admob_vars = {  
  26.                         pubid: 'a14e4b353ccfa57', // publisher id  
  27.                         bgcolor: '356FA8', // background color (hex)  
  28.                         text: 'FFFFFF', // font-color (hex)  
  29.                         test: false // test mode, set to false to receive live ads  
  30.                     };  
  31.                     </script>  
  32.                 <script type="text/javascript" src="http://mmv.admob.com/static/iphone/iadmob.js"></script>  
  33.    
  34.                 <div data-role="collapsible" data-collapsed="false">  
  35.                     <div id='lifeSpanBegin'>Born: {ARTIST_BIRTH_DATE}</div>  
  36.                     <div id='gender'>Gender: {ARTIST_GENDER} </div>  
  37.                     <div id='country'>Country: {ARTIST_COUNTRY} </div>  
  38.                     <div id='alias'>Alias:  {ARTIST_ALIAS} </div>  
  39.                     <div id='tags'>Tags: {ARTIST_TAGS}</div>  
  40.                 </div>  
  41.    
  42.                     <div data-role="collapsible-set">  
  43.    
  44.                         <div data-role="collapsible" data-collapsed="false">  
  45.                             <h3>Releases</h3>  
  46.                             <ul data-role="listview" data-inset="true">  
  47.                                  {RELEASES_LIST}  
  48.                             </ul>  
  49.                         </div>  
  50.    
  51.                         <div data-role="collapsible">  
  52.                             <h3>Links</h3>  
  53.                            <ul data-role="listview" data-inset="true">  
  54.                                  {LINKS_LIST}  
  55.                             </ul>  
  56.                         </div>  
  57.    
  58.                     </div>  
  59.                 </div><!--/content-primary --> 
  60.             </div><!-- /content --> 
  61.    
  62.             <div data-role="footer" class="footer-docs" data-theme="b">  
  63.             <h2>Data from MusicBrainz.org</h2>  
  64.             </div>  
  65.             </div><!-- /page --> 
  66.     </body>  
  67. </html 

現在,我們為之前所列的20位歌手創建訪問MusicBrainz Web服務的PHP文件,并為每一個歌手創建HTML文件。我們使用了PHP Array來存儲20位流行歌手的歌手編號。你還可以將歌手編輯存儲在數據庫中,使用PHP-Mysql代碼來獲取歌手編號及其他必要的信息。

MusicBrainz為開發人員提供了可以在本地下載和處理的數據庫,而不是使用Web服務。你可以下載數據庫,學習如何在你的本地機器上配置同樣的內容。

  1. <?php  
  2. header("Content-type: text/html; charset=utf-8");  
  3.    
  4. include 'classes/artist.php';  
  5. include 'classes/release.php';  
  6. include 'classes/relation.php';  
  7.    
  8. $artist         = new artist();  
  9. $release        = new release();  
  10. $relation       = new relation();  
  11. $artistTemplate = file_get_contents("artistTemplate.html");  
  12. $outputFolder   = "Data";  
  13.    
  14. $artistId   =   array("650e7db6-b795-4eb5-a702-5ea2fc46c848""cc197bad-dc9c-440d-a5b5-d52ba2e14234""73e5e69d-3554-40d8-8516-00cb38737a1c",  
  15.                       "122d63fc-8671-43e4-9752-34e846d62a9c""f82bcf78-5b69-4622-a5ef-73800768d9ac""d5be5333-4171-427e-8e12-732087c6b78e",  
  16.                       "20244d07-534f-4eff-b4d4-930878889970""eeb1195b-f213-4ce1-b28c-8565211f8e43""e21857d5-3256-4547-afb3-4b6ded592596",  
  17.                       "72c536dc-7137-4477-a521-567eeb840fa8""65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab""45a663b5-b1cb-4a91-bff6-2bef7bbfdd76",  
  18.                       "f5dfa020-ad69-41cd-b3d4-fd7af0414e94""ada7a83c-e3e1-40f1-93f9-3e73dbc9298a""e0140a67-e4d1-4f13-8a01-364355bee46e",  
  19.                       "3d2b98e5-556f-4451-a3ff-c50ea18d57cb""0103c1cc-4a09-4a5d-a344-56ad99a77193""d8354b38-e942-4c89-ba93-29323432abc3",  
  20.                       "d262ea27-3ffe-40f7-b922-85c42d625e67""35f866dc-c061-48ba-8157-cf2e0eac4857");  
  21.    
  22. foreach ($artistId as $id)  
  23. {  
  24.         $MBArtistQuery         = "http://musicbrainz.org/ws/2/artist/?query=arid:$id";  
  25.         $MBArtistReleasesQuery = "http://musicbrainz.org/ws/2/release/?query=arid:$id";  
  26.         $MBArtistLinksQuery    = "http://musicbrainz.org/ws/2/artist/$id?inc=url-rels";  
  27.    
  28.         $fileHandle = fopen("$outputFolder/$id.html""w+");  
  29.         $artistXML  = simplexml_load_file("$MBArtistQuery");  
  30.         $artistData = showArtist($id$artistXML$artistTemplate);  
  31.    
  32.         sleep(20);  
  33.    
  34.         $artistReleaseXML = simplexml_load_file("$MBArtistReleasesQuery");  
  35.         $artistData       = showArtistReleases($id$artistReleaseXML$artistData);  
  36.    
  37.         sleep(20);  
  38.    
  39.         $artistLinksXML = simplexml_load_file("$MBArtistLinksQuery");  
  40.         $artistData     = showArtistLinks($id$artistLinksXML$artistData);  
  41.         fwrite($fileHandle$artistData);  
  42.         fclose($fileHandle);  
  43.         sleep(20);  
  44. }  
  45.    
  46. function showArtistLinks($artistId$artistXML$artistTemplate)  
  47. {  
  48.     $links = "";  
  49.     foreach ($artistXML->artist->{'relation-list'}->relation as $artistsRelation)  
  50.     {  
  51.         $relation->type   = $artistsRelation['type'];  
  52.         $relation->target = $artistsRelation->target;  
  53.    
  54.         $links .= "<li><a href='$relation->target'><h4>$relation->type</h4><p><strong>$relation->target</strong></p></a></li>";  
  55.     }  
  56.     $artistTemplate = str_replace("{LINKS_LIST}"$links$artistTemplate);  
  57.     return $artistTemplate;  
  58. }  
  59.    
  60. function showArtistReleases($artistId$artistReleaseXML$artistTemplate)  
  61. {  
  62.     $releases = "";  
  63.     foreach ($artistReleaseXML->{'release-list'}->release as $releaseInfo) {  
  64.         $release->id     = $releaseInfo['id'];  
  65.         $release->title  = $releaseInfo->title;  
  66.         $release->date   = $releaseInfo->date;  
  67.         $release->status = $releaseInfo->status;  
  68.         $release->type   = $releaseInfo->{'release-group'}['type'];  
  69.         $release->format = $releaseInfo->{'medium-list'}->medium->format;  
  70.         $release->tracks = $releaseInfo->{'medium-list'}->{'track-count'};  
  71.         $releases       .= "<li>$release->title<span class='ui-li-count'>$release->date</span></li>\n";  
  72.     }  
  73.    
  74.     $artistTemplate = str_replace("{RELEASES_LIST}"$releases$artistTemplate);  
  75.     return $artistTemplate;  
  76. }  
  77.    
  78. function showArtist($artistId$artistXML$artistTemplate)  
  79. {  
  80.     $artist->id            = $artistId;  
  81.     $artist->name          = $artistXML->{'artist-list'}->artist->name;  
  82.     $artist->gender        = $artistXML->{'artist-list'}->artist->gender;  
  83.     $artist->country       = $artistXML->{'artist-list'}->artist->country;  
  84.     $artist->lifeSpanBegin = $artistXML->{'artist-list'}->artist->{'life-span'}->begin;  
  85.    
  86.     foreach ($artistXML->{'artist-list'}->artist->{'alias-list'}->alias as $artistAlias) {  
  87.         $artist->alias.=$artistAlias . ",";  
  88.     }  
  89.    
  90.     foreach ($artistXML->{'artist-list'}->artist->{'tag-list'}->tag as $artistTags) {  
  91.         $artist->tags.=$artistTags->name . ",";  
  92.     }  
  93.    
  94.     $artistTemplate = str_replace("{ARTIST_NAME}"$artist->name, $artistTemplate);  
  95.     $artistTemplate = str_replace("{ARTIST_BIRTH_DATE}"$artist->lifeSpanBegin, $artistTemplate);  
  96.     $artistTemplate = str_replace("{ARTIST_GENDER}"$artist->gender, $artistTemplate);  
  97.     $artistTemplate = str_replace("{ARTIST_COUNTRY}"$artist->country, $artistTemplate);  
  98.     $artistTemplate = str_replace("{ARTIST_ALIAS}"$artist->alias, $artistTemplate);  
  99.     $artistTemplate = str_replace("{ARTIST_TAGS}"$artist->tags, $artistTemplate);  
  100.    
  101.     return $artistTemplate;  
  102. }  
  103. ?> 

在index.php頂部包括的歌手、唱片和關系這些類是簡單的類對象,保存了歌手的每一種類型的信息。可在Project Download鏈接中的PHP文件夾中找到同樣的內容。

【51CTO譯稿,非經授權謝絕轉載,合作媒體轉載請注明原文出處、作者及51CTO譯者!】#p#

第三步:將創建的歌手文件復制到你的Xcode項目中

從命令行接口(CLI)運行index.php,它應該會在Data文件夾里面生成20個帶有格式ARTIST-ID.html的HTML文件。把這20個文件拷貝到你Xcode項目中的數據文件夾。現在,運行Xcode項目,點擊某個歌手,即可瀏覽到詳細資料頁面。你應該會看到面向iPad的下列結果:

運行Xcode項目 點擊某歌手即可瀏覽到詳細資料頁面

點擊查看大圖

別忘了把你的Xcode項目設為“Universal”(通用),那樣你的雜志應用程序在iPhone上也可以順暢運行。在本例中,該應用程序用起來和看起來都很好!

把你的Xcode項目設為“Universal”(通用),那樣你的雜志應用程序在iPhone上也可以順暢運行#p#

第四步:控制雜志的頁面順序

在默認情況下,PugPig沒有任何順序地顯示數據文件夾中的所有HTML文件,不管index.html或其他文件名稱。為了總是先顯示index.html文件,然后顯示其余頁面,我們需要在數據文件夾指定一個清單文件(manifest file)。將它命名為custom.manifest,然后為它添加下列內容。

  1. CACHE MANIFEST  
  2. index.html  
  3. 35f866dc-c061-48ba-8157-cf2e0eac4857.html  
  4. d262ea27-3ffe-40f7-b922-85c42d625e67.html  
  5. d8354b38-e942-4c89-ba93-29323432abc3.html  
  6. 0103c1cc-4a09-4a5d-a344-56ad99a77193.html  
  7. 3d2b98e5-556f-4451-a3ff-c50ea18d57cb.html  
  8. e0140a67-e4d1-4f13-8a01-364355bee46e.html  
  9. ada7a83c-e3e1-40f1-93f9-3e73dbc9298a.html  
  10. f5dfa020-ad69-41cd-b3d4-fd7af0414e94.html  
  11. 45a663b5-b1cb-4a91-bff6-2bef7bbfdd76.html  
  12. 65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab.html  
  13. 72c536dc-7137-4477-a521-567eeb840fa8.html  
  14. e21857d5-3256-4547-afb3-4b6ded592596.html  
  15. eeb1195b-f213-4ce1-b28c-8565211f8e43.html  
  16. 20244d07-534f-4eff-b4d4-930878889970.html  
  17. d5be5333-4171-427e-8e12-732087c6b78e.html  
  18. 82bcf78-5b69-4622-a5ef-73800768d9ac.html  
  19. 122d63fc-8671-43e4-9752-34e846d62a9c.html  
  20. 73e5e69d-3554-40d8-8516-00cb38737a1c.html  
  21. cc197bad-dc9c-440d-a5b5-d52ba2e14234.html  
  22. 650e7db6-b795-4eb5-a702-5ea2fc46c848.html 

我們還需要在項目中稍稍改動一點Objective-C代碼。打開MusicBrainz_MagazineViewController.m文件,把viewDidLoad方法中的下面這行:

  1. [pageControl setDataSource:[[[KGLocalFileDataSource alloc] initWithPath:@"Data"] autorelease]];  

換成

  1. [pageControl setDataSource:[[[KGHTMLManifestDataSource alloc] initWithPath:@"Data/custom.manifest"] autorelease]];  

另外,在同一文件中pageControl的尺度從0.4166667改成1.0。

  1. [pageControl setScale:1.0];  

該尺度由基于iOS設備的jQuery Mobile自動處理,所以我們不需要為iPhone縮小尺度。

最后的改進

現在我已經為多位巡演的流行歌手創建了HTML頁面,可以對應用程序作進一步的改進,只要使下面這個PHP過程實現自動化:為所有歌手創建HTML頁面,并將它們保存在數據文件夾中,因而制作一份完整的離線歌手雜志。至于圖像,你可以獲取維基百科CC圖像,把它們加入到應用程序中,讓它看起來更吸引人。

為了讓應用程序顯得更可愛,可以添加一些Ajax魅力,使用來自eventful.com或songkick.com等眾多活動網站和音樂網站的豐富鏈接、API和RSS,創建一個動態頁面。比如說,為歌手從eventful.com獲取最新活動或演唱會這些素材!

原文名稱:Build a MusicBrainz App

原文鏈接:http://mobile.tutsplus.com/tutorials/mobile-web-apps/build-a-musicbrainz-app/

【51CTO譯稿,非經授權謝絕轉載,合作媒體轉載請注明原文出處、作者及51CTO譯者!】

責任編輯:佚名 來源: 51CTO.com
相關推薦

2016-05-27 15:44:12

H5LeanCloudWex5

2015-02-05 10:11:44

HTML5Application

2012-03-21 09:36:33

ibmdw

2025-11-21 08:00:00

FirebaseGeminiAI智能體

2024-12-10 08:01:38

2013-08-29 09:53:04

HTML5MongoDB位置感知

2012-05-24 15:49:35

HTML5

2012-06-01 09:29:56

HTML5

2011-07-12 09:25:45

HTML 5

2015-01-12 09:52:08

移動應用原生混合

2015-01-12 12:11:10

移動應用原生混合

2024-05-15 11:42:33

FlutterWeb 庫應用程序

2012-03-30 15:54:43

ibmdw

2012-06-15 11:32:19

ibmdw

2017-12-10 14:13:14

云服務云原生應用程序

2011-09-01 10:01:35

PhoneGap應用程序GoodDay

2010-02-04 10:17:38

Android應用程序

2017-03-02 11:10:39

AndroidMVVM應用程序

2012-05-29 10:04:08

2012-03-15 15:35:51

iUI框架EclipseiOS Web
點贊
收藏

51CTO技術棧公眾號

视频在线观看入口黄最新永久免费国产| 国产欧美日韩另类| 亚洲欧美专区| 一区二区三区四区高清精品免费观看 | aa片在线观看视频在线播放| 最新欧美电影| 一区二区在线观看视频在线观看| 精品国产乱码一区二区三区四区 | 777午夜精品免费视频| 国产精品一区在线免费观看| 亚州精品国产精品乱码不99按摩| 蜜桃久久精品一区二区| 欧美激情网友自拍| 99久久99久久精品免费看小说. | 久久五月天婷婷| 岳乳丰满一区二区三区| 激情成人亚洲| 少妇av一区二区三区| www.com日本| 久久人体av| 欧美日韩亚洲视频| 男女爱爱视频网站| www.国产精品.com| 不卡一区二区中文字幕| 成人欧美一区二区三区黑人| 国产成人一级片| 欧美激情视频一区二区三区在线播放| 亚洲人成伊人成综合网久久久| 一二三av在线| 成人网ww555视频免费看| 午夜精品福利久久久| 国产精品波多野结衣| 酒色婷婷桃色成人免费av网| 成人动漫一区二区在线| 亚洲影院色无极综合| 在线观看国产成人| 日日骚欧美日韩| 欧美在线国产精品| 日本在线小视频| 欧美有码视频| 欧美成人免费视频| 久久精品亚洲a| 成人av二区| 国产性猛交xxxx免费看久久| 能免费看av的网站| 激情av综合| 精品久久一区二区三区| 丰满饥渴老女人hd| 久久久久亚洲精品中文字幕| 4438x亚洲最大成人网| 蜜桃免费在线视频| 成人在线免费电影网站| 在线视频你懂得一区| 日本在线观看a| 香蕉伊大人中文在线观看| 午夜影院久久久| 成熟丰满熟妇高潮xxxxx视频| 韩国日本一区| 亚洲成人精品在线观看| 国内精品视频一区二区三区| av丝袜在线| 亚洲高清三级视频| 国产午夜福利在线播放| 欧美13videosex性极品| 大荫蒂欧美视频另类xxxx| 欧美爱爱视频免费看| 三级在线观看视频| 日本久久一区二区| 中文字幕第38页| 亚洲免费看片| 精品盗摄一区二区三区| 成人在线视频免费播放| 亚洲69av| 日韩亚洲国产中文字幕| 69xx绿帽三人行| 亚洲无线视频| 69av在线视频| 黄色一区二区视频| 国产麻豆91精品| 国产精品一区二区三区观看| 日韩电影在线观看完整版| 久久久www成人免费无遮挡大片| 亚洲国产一区二区精品视频 | 污片在线免费看| 国产精品3区| 精品盗摄一区二区三区| 欧洲女同同性吃奶| 国产精品99久久| 欧美精品aaa| 无码人妻久久一区二区三区不卡| 免费xxxx性欧美18vr| 99re在线观看| 国产资源在线观看| 亚洲日本欧美天堂| 九九九九免费视频| 爱情电影网av一区二区| 日韩成人在线视频| 欧洲美女女同性互添| 亚洲欧洲一区| 国产在线观看91精品一区| 老熟妇高潮一区二区高清视频| 国产午夜精品一区二区| 99re6这里有精品热视频| 三级成人黄色影院| 日韩欧美中文字幕精品| 日本免费www| 极品裸体白嫩激情啪啪国产精品| 国产精品久久在线观看| 欧美特级特黄aaaaaa在线看| 国产精品无圣光一区二区| 国产精品久久..4399| 欧洲精品久久久久毛片完整版| 精品成人在线观看| 欧美性x x x| 久久精品首页| 国产精品视频免费观看| 亚洲精品传媒| 欧美日韩中文字幕| 99视频在线观看视频| 精品久久久中文字幕| 久久人人爽人人爽人人片av高清| 黄色一区二区视频| 久久免费精品国产久精品久久久久| 四虎免费在线观看视频| 日韩精选视频| 亚洲日本成人网| 国产成年人免费视频| 国产一区亚洲一区| 亚洲福利av| 日本成人伦理电影| 日韩成人中文字幕| 国产午夜视频在线播放| 国产精品一区二区91| 亚洲欧洲精品一区| 精品123区| 亚洲人在线观看| 久久精品无码av| 久久亚洲影视婷婷| 久草精品在线播放| 九一国产精品| 欧洲日韩成人av| 午夜性色福利视频| 欧美日韩性视频| 狠狠人妻久久久久久综合蜜桃| 亚洲国产综合在线看不卡| aaa级精品久久久国产片| 怡红院在线播放| 欧美一区二区三区婷婷月色| 一区二区成人免费视频| 激情综合亚洲精品| 中国黄色录像片| www.豆豆成人网.com| 色综合91久久精品中文字幕| 亚洲欧美另类一区| 亚洲国产人成综合网站| av网页在线观看| 一区二区日韩免费看| 久久99国产精品| 桃色av一区二区| 亚洲区一区二区| 国产裸体美女永久免费无遮挡| 国产清纯美女被跳蛋高潮一区二区久久w | 特级西西www444人体聚色| 日韩电影在线观看电影| 在线视频一区观看| 欧美黄视频在线观看| 久久久久久久国产| 亚洲欧美一区二区三| 色综合久久66| 亚洲欧美卡通动漫| 国产精品12区| 成人av一级片| 欧洲视频一区| 91在线精品视频| sm性调教片在线观看 | 一级黄色性视频| 毛片一区二区三区| 国产91视频一区| 欧美91在线| 国产日韩一区在线| 丝袜中文在线| 亚洲区在线播放| 国产美女免费视频| 亚洲mv大片欧洲mv大片精品| 国产精品一二三区在线观看| 国精产品一区一区三区mba视频 | 国产在线美女| 最近2019中文字幕大全第二页| va视频在线观看| 欧美日韩一区二区免费在线观看| 亚洲一区 欧美| 国产精品亚洲午夜一区二区三区| 国产午夜伦鲁鲁| 99国产精品免费视频观看| 国产一区自拍视频| 久久久国产精品网站| 992tv在线成人免费观看| 98在线视频| 亚洲国产中文字幕在线观看| 亚洲一卡二卡在线| 欧美日韩国产一中文字不卡| 国产第一页浮力| 久久精品网站免费观看| 黄色a级三级三级三级| 久久资源在线| 国产欧美日韩网站| 亚洲综合色网| 日韩av图片| 欧美黄色影院| 亚洲一区二区三区视频| 51一区二区三区| 97碰碰碰免费色视频| 黄色精品在线观看| 国产亚洲一级高清| 天堂av2024| 日韩一区二区影院| 一级久久久久久久| 日本道免费精品一区二区三区| 国产1区2区3区4区| 国产精品黄色在线观看| 在哪里可以看毛片| av电影在线观看完整版一区二区| 网站在线你懂的| 免费在线一区观看| 久草精品在线播放| av成人国产| www插插插无码免费视频网站| 日韩免费一区| 日本高清一区| 亚洲免费毛片| 国模精品一区二区三区| 亚洲性视频在线| 91夜夜未满十八勿入爽爽影院 | 99视频在线免费观看| 日韩黄色三级在线观看| 国产精品久久久久久久久久ktv| 欧美少妇精品| 57pao成人国产永久免费| 多野结衣av一区| 久久久亚洲国产| 国产区美女在线| 久久久视频精品| 欧美wwww| 97精品国产91久久久久久| 毛片在线网址| 亚洲**2019国产| 成入视频在线观看| 911国产网站尤物在线观看| 国产在线精彩视频| 欧美做爰性生交视频| 日韩在线伦理| 国产精品福利在线观看网址| 亚洲精品国产嫩草在线观看| 国产精品香蕉在线观看| 久久久久久久性潮| 亚洲va男人天堂| 秋霞一区二区| 国产一区不卡在线观看| 香蕉久久夜色精品国产更新时间| 精品午夜一区二区| 欧美日韩xxxx| 樱花www成人免费视频| 一区二区三区四区在线观看国产日韩| 免费成人进口网站| 亚洲福利电影| 黑森林福利视频导航| 免费精品99久久国产综合精品| 一个色综合久久| 豆国产96在线|亚洲| 亚洲男人在线天堂| 国产欧美一区二区三区在线看蜜臀| 国产精品suv一区二区88| 亚洲少妇30p| 特一级黄色大片| 欧美性xxxxxx少妇| 精品人妻久久久久一区二区三区| 精品免费日韩av| 免费播放片a高清在线观看| yw.139尤物在线精品视频| 黄视频在线免费看| 奇门遁甲1982国语版免费观看高清| jizz久久久久久| 999热视频| 国产成人精品免费视| 女人床在线观看| 三级久久三级久久久| 亚洲高清视频免费| 91亚洲精品久久久蜜桃| 久久久国产一级片| 亚洲成人午夜影院| 影音先锋黄色网址| 日韩的一区二区| 国产在线更新| 国产不卡av在线| 一区二区三区四区视频免费观看 | 国产美女91呻吟求| 成人av综合网| 亚洲精品成人自拍| 亚洲另类黄色| 天堂av.com| 久久久久亚洲蜜桃| 国产精品 欧美 日韩| 欧美日韩国产小视频在线观看| 天天干天天做天天操| 久久久成人精品| 丝袜美腿诱惑一区二区三区| 97久久人人超碰caoprom欧美| 国产一区网站| 黄色国产一级视频| 国产成人无遮挡在线视频| 2019男人天堂| 欧美性猛交xxxx黑人猛交| 精品国产一级片| 日韩在线观看你懂的| 成人爽a毛片免费啪啪| 高清不卡日本v二区在线| 色婷婷色综合| 国产a级片免费观看| av在线这里只有精品| 欧美精品久久久久性色| 欧美日韩国产区一| 国产毛片av在线| 国产91精品久久久久久| 成人直播在线观看| 欧美 国产 精品| 久久99这里只有精品| 手机看片日韩av| 在线看日本不卡| 天堂成人在线| 久久99精品视频一区97| 精品国产亚洲一区二区三区| 亚洲国产午夜伦理片大全在线观看网站 | 91农村精品一区二区在线| 中文字幕第28页| 日韩精品一区二区三区三区免费 | 亚洲丝袜另类动漫二区| 在线观看国产精品视频| 国产一区二区三区在线观看视频 | 成人羞羞国产免费| 五月久久久综合一区二区小说| 色一情一乱一伦一区二区三区日本| 久久综合色婷婷| 成年人av网站| 亚洲人av在线影院| 亚州一区二区三区| 四虎永久国产精品| 日本欧美韩国一区三区| 制服 丝袜 综合 日韩 欧美| 91极品美女在线| av一区在线观看| 成人激情av在线| 91精品国产乱码久久久久久久| ass极品水嫩小美女ass| 伊人夜夜躁av伊人久久| 丁香六月天婷婷| 4438全国成人免费| 精品国产欧美日韩| 日本肉体xxxx裸体xxx免费| 亚洲欧洲日产国码二区| a级片在线播放| 久久久久久久91| 亚洲动漫精品| 黄色成人免费看| 亚洲人成7777| 手机在线不卡av| 国产suv精品一区二区| 首页国产精品| 师生出轨h灌满了1v1| 性久久久久久久久| 国产裸舞福利在线视频合集| 成人免费网站在线| 亚洲小说区图片区| 国产成人av一区二区三区不卡| 精品视频1区2区| 青春草免费在线视频| 欧美极品日韩| 九九国产精品视频| 国产精品第56页| 国产亚洲精品成人av久久ww| 欧美中文高清| 97国产精东麻豆人妻电影| 国产精品久久久久久久久免费丝袜| av av片在线看| 欧美一级大胆视频| 99成人在线视频| 国产精品久久久免费观看| 欧美天堂一区二区三区| 牛牛精品视频在线| 日本一区视频在线观看免费| 国产一区二区成人久久免费影院 | 伊人久久大香线蕉综合热线| 日本xxx在线播放| 91精品国产黑色紧身裤美女| 中文字幕色婷婷在线视频 | 一本综合精品| 手机免费观看av| 亚洲精美色品网站| 国产不卡精品在线| 妞干网在线免费视频| 亚洲一区在线电影|