#SwiftでYoutube検索【メモ】
Objective-C言語で書いていたYoutube検索処理をSwiftに置き換えてみました。Qiitaには要点だけ記載して、アプリの形にしたものはGithubに公開しています。
Youtubeの検索では、**【YouTube Data API v3】**を利用します。
##YoutubeのAPIについて
API Key
Youtube検索で利用しているのは、**【YouTube Data API v3】**です。リンク先に設定の手順などが記載されているので、登録と設定を行い、Google Developer ConsoleでiOS用の API_Key を取得しておきます。
※この API Key をswiftのコード上で利用します。
URLとパラメータ
Youtubeに対するリクスエストURL内に含めるパラメータで、検索の条件などを指定することができます。
Youtube Data API v3 - Searchパラメータ
パラメータ | 意味 |
---|---|
&key=API_Key | 事前に取得したAPI Keyを指定します |
&q=検索文字 | 検索したい文字列です |
&part=snippet | サムネイルなどの詳細情報を結果のJSON文字列に含める |
&maxResults=10 | 最大件数10件 |
&order=viewCount | 再生回数の多い順に並べ替え |
今回使用するURLでは、上記の要素を指定しています。
##URLの準備(Swiftコード)
Youtube APIで決められているURLを構成します。URLには事前の設定で取得したAPI_Keyを含める必要があります。また、検索のキーワードなどに日本語を含めることを前提としてして文字列はURLエンコード処置を行っておきます。
let API_KEY:String = "xxxxxxxxxxxx"
//SearchBarに入力されている文字列
println("search text=\(text)")
//URLエンコーディング(文字列エスケープ処理)
let searchWord:String! = text.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
//Youtubeに対して、検索をかけるURL文字列
let urlString:String = "https://www.googleapis.com/youtube/v3/search?key=\(API_KEY)&q=\(searchWord)&part=snippet&maxResults=10&order=viewCount"
//データを読み取るためのNSURL
let url:NSURL! = NSURL(string:urlString)
JSONデータの取得
データの取得には、NSURLConnectionクラスを使用します。このクラスでURLに対してリクエストをする場合、同期、非同期の呼び出しが可能です。このコードでは非同期の呼び出しをしているので、結果が戻ってくるまでに時間がかかったとしても、iOSアプリの動作を妨げることがありません。
※エラー処理については割愛
let urlRequest:NSURLRequest = NSURLRequest(URL:url)
//URLに対してNSDataの結果を非同期で取得する
NSURLConnection.sendAsynchronousRequest(
urlRequest,
queue: NSOperationQueue.mainQueue(),
completionHandler:{(response,jsonData,error) -> Void in
//データが取得できた場合には、JSONを解析してNSDicrionaryに格納
let dic:NSDictionary = NSJSONSerialization.JSONObjectWithData(
jsonData!,
options: NSJSONReadingOptions.AllowFragments,
error: nil) as NSDictionary
//結果のJSON文字列から必要な箇所だけを取得(itemsのキーだけを取り出す)
let resultArray:NSArray = dic["items"] as NSArray
println(resultArray)
//取得したデータの表示
})
同期、非同期の切り替えには、使用するメソッドを切り替えます。
※NSURLConnectionクラスの使用方法は、Objective-Cと引数の記法など変わっているので、注意が必要です。
メソッド名 | 用途 | 結果の取得方法 |
---|---|---|
sendSynchronousRequest | 同期呼び出し | 戻り値がNSData? |
sendAsynchronousRequest | 非同期呼び出し | クロージャの引数にNSData! |
##課題
SwiftでJSON文字列からDictionary,Arrayへの配列変換に使える機能が見当たらないため、NSDictionary,NSArrayを利用してデータを保持しています。Swiftで便利な方法があればそちらに書き換える予定です。